/ Hex Artifact Content
Login

Artifact 081150263715e7a4d42d6fa1c5c246076cf24f58:


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 32 39 20 32 30 30 39 2f 30  c,v 1.629 2009/0
0190: 36 2f 31 36 20 30 34 3a 33 31 3a 34 39 20 64 61  6/16 04:31:49 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: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
4ef0: 50 75 74 4f 76 66 6c 28 79 2c 7a 29 20 53 51 4c  PutOvfl(y,z) SQL
4f00: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
4f10: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
4f20: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
4f30: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
4f40: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
4f50: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
4f60: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
4f70: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
4f80: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
4f90: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
4fa0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
4fb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4fc0: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
4fd0: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
4fe0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
4ff0: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
5000: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
5010: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
5020: 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61  aData + ((P)->ma
5030: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
5040: 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50  e(&(P)->aData[(P
5050: 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  )->cellOffset+2*
5060: 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  (I)])))../*.** T
5070: 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c  his a more compl
5080: 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69  ex version of fi
5090: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
50a0: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
50b0: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
50c0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
50d0: 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a    See insert.*/.
50e0: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
50f0: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
5100: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
5110: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
5120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5130: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
5140: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5150: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
5160: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
5170: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
5180: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
5190: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
51a0: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
51b0: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
51c0: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
51d0: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
51e0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
51f0: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
5200: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
5210: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
5220: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
5230: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
5240: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
5250: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
5260: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
5270: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
5280: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
5290: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
52a0: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
52b0: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
52c0: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
52d0: 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65  on.  sqlite3Btre
52e0: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
52f0: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
5300: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
5310: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  d argument and s
5320: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
5330: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
5340: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
5350: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
5360: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
5370: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
5380: 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
5390: 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43  file, the parseC
53a0: 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20  ell() macro can 
53b0: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
53c0: 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42  d of.** sqlite3B
53d0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
53e0: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
53f0: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
5400: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
5410: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
5420: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
5430: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
5440: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
5450: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
5460: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
5470: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
5480: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
5490: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
54a0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
54b0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
54c0: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
54d0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
54e0: 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20  u16 n;          
54f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5500: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
5510: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
5520: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
5530: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
5540: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
5550: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
5560: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
5570: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5580: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
5590: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
55a0: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
55b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
55c0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
55d0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
55e0: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
55f0: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
5600: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
5610: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
5620: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
5630: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
5640: 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e  sData ){.      n
5650: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
5660: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
5670: 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oad);.    }else{
5680: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
5690: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  = 0;.    }.    n
56a0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
56b0: 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26  Cell[n], (u64*)&
56c0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
56d0: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
56e0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c   nPayload;.  }el
56f0: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
5700: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20  Data = 0;.    n 
5710: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
5720: 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f  pCell[n], nPaylo
5730: 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ad);.    pInfo->
5740: 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  nKey = nPayload;
5750: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  .  }.  pInfo->nP
5760: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
5770: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61  d;.  pInfo->nHea
5780: 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6c  der = n;.  if( l
5790: 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d  ikely(nPayload<=
57a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29  pPage->maxLocal)
57b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
57c0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
57d0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
57e0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
57f0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
5800: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
5810: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
5820: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
5830: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  */.    int nSize
5840: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
5850: 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  tal size of cell
5860: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65   content in byte
5870: 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d  s */.    nSize =
5880: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20   nPayload + n;. 
5890: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
58a0: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
58b0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
58c0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
58d0: 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e 33 29  if( (nSize & ~3)
58e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  ==0 ){.      nSi
58f0: 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f  ze = 4;        /
5900: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
5910: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20  ize is 4 */.    
5920: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  }.    pInfo->nSi
5930: 7a 65 20 3d 20 28 75 31 36 29 6e 53 69 7a 65 3b  ze = (u16)nSize;
5940: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
5950: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
5960: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
5970: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
5980: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
5990: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
59a0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
59b0: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
59c0: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
59d0: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
59e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
59f0: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
5a00: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
5a10: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
5a20: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
5a30: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
5a40: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
5a50: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
5a60: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
5a70: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
5a80: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
5a90: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
5aa0: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
5ab0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
5ac0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
5ad0: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
5ae0: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
5af0: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
5b00: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
5b10: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
5b20: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
5b30: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
5b40: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
5b50: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
5b60: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
5b70: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
5b80: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
5b90: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
5ba0: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
5bb0: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
5bc0: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
5bd0: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
5be0: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
5bf0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
5c00: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
5c10: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
5c20: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
5c30: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
5c40: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
5c50: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
5c60: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
5c70: 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75  - 4);.    if( su
5c80: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
5c90: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
5ca0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
5cb0: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
5cc0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
5cd0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
5ce0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
5cf0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
5d00: 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66  low = (u16)(pInf
5d10: 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a  o->nLocal + n);.
5d20: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
5d30: 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66   = pInfo->iOverf
5d40: 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23  low + 4;.  }.}.#
5d50: 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c  define parseCell
5d60: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
5d70: 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74 65  Info) \.  sqlite
5d80: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
5d90: 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64  tr((pPage), find
5da0: 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69  Cell((pPage), (i
5db0: 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29  Cell)), (pInfo))
5dc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
5dd0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
5de0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
5df0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
5e00: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
5e10: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
5e20: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
5e30: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
5e40: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
5e50: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
5e60: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
5e70: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
5e80: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
5e90: 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  .  parseCell(pPa
5ea0: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
5eb0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  );.}../*.** Comp
5ec0: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ute the total nu
5ed0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
5ee0: 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20  at a Cell needs 
5ef0: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  in the cell.** d
5f00: 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20  ata area of the 
5f10: 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65  btree-page.  The
5f20: 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69   return number i
5f30: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c  ncludes the cell
5f40: 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20  .** data header 
5f50: 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61  and the local pa
5f60: 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61  yload, but not a
5f70: 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
5f80: 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65   or.** the space
5f90: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c   used by the cel
5fa0: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
5fb0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
5fc0: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
5fd0: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
5fe0: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26  .  u8 *pIter = &
5ff0: 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69  pCell[pPage->chi
6000: 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33  ldPtrSize];.  u3
6010: 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66  2 nSize;..#ifdef
6020: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
6030: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
6040: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
6050: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
6060: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
6070: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
6080: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
6090: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
60a0: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
60b0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
60c0: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
60d0: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
60e0: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
60f0: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
6100: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
6110: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
6120: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
6130: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
6140: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
6150: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nfo;.  sqlite3Bt
6160: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
6170: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
6180: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
6190: 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  f..  if( pPage->
61a0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38  intKey ){.    u8
61b0: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20   *pEnd;.    if( 
61c0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
61d0: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d  {.      pIter +=
61e0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
61f0: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20  er, nSize);.    
6200: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69  }else{.      nSi
6210: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ze = 0;.    }.. 
6220: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
6230: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
6240: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
6250: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
6260: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
6270: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
6280: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
6290: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
62a0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
62b0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
62c0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
62d0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
62e0: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
62f0: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
6300: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
6310: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
6320: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
6330: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
6340: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
6350: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53 69  ;.  }..  if( nSi
6360: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
6370: 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  al ){.    int mi
6380: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
6390: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53  minLocal;.    nS
63a0: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  ize = minLocal +
63b0: 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63   (nSize - minLoc
63c0: 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  al) % (pPage->pB
63d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
63e0: 34 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  4);.    if( nSiz
63f0: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
6400: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
6410: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
6420: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
6430: 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b  4;.  }.  nSize +
6440: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
6450: 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68  pCell);..  /* Th
6460: 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
6470: 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20  f any cell is 4 
6480: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20  bytes. */.  if( 
6490: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e  nSize<4 ){.    n
64a0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20  Size = 4;.  }.. 
64b0: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
64c0: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
64d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
64e0: 29 6e 53 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65  )nSize;.}.#ifnde
64f0: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
6500: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
6510: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6520: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
6530: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  n cellSizePtr(pP
6540: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
6550: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
6560: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6570: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6580: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
6590: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
65a0: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
65b0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
65c0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
65d0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
65e0: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
65f0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
6600: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
6610: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
6620: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
6630: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
6640: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
6650: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
6660: 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72  fo info;.  asser
6670: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
6680: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
6690: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
66a0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
66b0: 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
66c0: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
66d0: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
66e0: 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
66f0: 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e 66 6f  d );.  if( (info
6700: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
6710: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
6720: 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
6730: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
6740: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
6750: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
6760: 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  w]);.    return 
6770: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
6780: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
6790: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
67a0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
67b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
67c0: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
67d0: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
67e0: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
67f0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
6800: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
6810: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
6820: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
6830: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6840: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
6850: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
6860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6870: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
6880: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6890: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
68a0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
68b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
68c0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
68d0: 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c  utex) );.  pCell
68e0: 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
68f0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
6900: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d  );.  return ptrm
6910: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
6920: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65  ge, pCell);.}.#e
6930: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
6940: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
6950: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
6960: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
6970: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
6980: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
6990: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
69a0: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
69b0: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
69c0: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
69d0: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
69e0: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
69f0: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
6a00: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
6a10: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
6a20: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
6a30: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
6a40: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
6a70: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
6aa0: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
6ab0: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
6ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
6ad0: 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62 79  fset of first by
6ae0: 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f  te after cell po
6af0: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
6b00: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6b20: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
6b30: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
6b40: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
6b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
6b60: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
6b70: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
6b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6b90: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
6ba0: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
6bb0: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
6bc0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
6bd0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
6be0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
6bf0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
6c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6c10: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
6c20: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6c30: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
6c40: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
6c50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6c60: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
6c70: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
6c80: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
6c90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
6ca0: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
6cb0: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
6cc0: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
6cd0: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
6ce0: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
6cf0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
6d00: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
6d10: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
6d20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
6d30: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
6d40: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
6d50: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
6d60: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
6d70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6d80: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
6d90: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
6da0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6db0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6dc0: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
6dd0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
6de0: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
6df0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
6e00: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
6e10: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
6e20: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
6e30: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
6e40: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
6e50: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
6e60: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
6e70: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
6e80: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
6e90: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
6ea0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
6eb0: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
6ec0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6ed0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
6ee0: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
6ef0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
6f00: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
6f10: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
6f20: 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Size;.  for(i=0;
6f30: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
6f40: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
6f50: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
6f60: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
6f70: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
6f80: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
6f90: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
6fa0: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
6fb0: 20 20 69 66 28 20 70 63 3e 3d 75 73 61 62 6c 65    if( pc>=usable
6fc0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
6fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6fe0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
6ff0: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
7000: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
7010: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
7020: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
7030: 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c 4f 66 66  if( cbrk<cellOff
7040: 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c 7c 20 70  set+2*nCell || p
7050: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
7060: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
7070: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7080: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
7090: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
70a0: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
70b0: 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a 20 20 20  & cbrk>=0 );.   
70c0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
70d0: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
70e0: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
70f0: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
7100: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
7110: 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74  cbrk>=cellOffset
7120: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
7130: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7140: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
7150: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
7160: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
7170: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
7180: 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65  = 0;.  addr = ce
7190: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
71a0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
71b0: 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62 72 6b 2d  [addr], 0, cbrk-
71c0: 61 64 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  addr);.  assert(
71d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
71e0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
71f0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
7200: 28 20 63 62 72 6b 2d 61 64 64 72 21 3d 70 50 61  ( cbrk-addr!=pPa
7210: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
7220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7230: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
7240: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7250: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
7260: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
7270: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
7280: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
7290: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
72a0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
72b0: 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
72c0: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
72d0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66  Page->aData[] of
72e0: 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 62   the .** first b
72f0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
7300: 20 73 70 61 63 65 2e 20 0a 2a 2a 0a 2a 2a 20 54   space. .**.** T
7310: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
7320: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 73 70  tees that the sp
7330: 61 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  ace between the 
7340: 65 6e 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  end of the cell-
7350: 6f 66 66 73 65 74 20 0a 2a 2a 20 61 72 72 61 79  offset .** array
7360: 20 61 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f   and the start o
7370: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
7380: 6e 74 20 61 72 65 61 20 69 73 20 61 74 20 6c 65  nt area is at le
7390: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 0a  ast nByte bytes.
73a0: 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 53 6f 20 74  ** in size. So t
73b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
73c0: 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  never fail..**.*
73d0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
73e0: 6c 72 65 61 64 79 20 36 30 20 6f 72 20 6d 6f 72  lready 60 or mor
73f0: 65 20 62 79 74 65 73 20 6f 66 20 66 72 61 67 6d  e bytes of fragm
7400: 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65 20  ents within the 
7410: 70 61 67 65 2c 0a 2a 2a 20 74 68 65 20 70 61 67  page,.** the pag
7420: 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65  e is defragmente
7430: 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
7440: 6e 67 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  ng. If this were
7450: 20 6e 6f 74 20 64 6f 6e 65 20 74 68 65 72 65 0a   not done there.
7460: 2a 2a 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  ** is a chance t
7470: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
7480: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
7490: 65 73 20 63 6f 75 6c 64 20 65 76 65 6e 74 75 61  es could eventua
74a0: 6c 6c 79 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  lly .** overflow
74b0: 20 74 68 65 20 73 69 6e 67 6c 65 2d 62 79 74 65   the single-byte
74c0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
74d0: 67 65 2d 68 65 61 64 65 72 20 69 6e 20 77 68 69  ge-header in whi
74e0: 63 68 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  ch this value.**
74f0: 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 73   is stored..*/.s
7500: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
7510: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
7520: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
7530: 65 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  e){.  const int 
7540: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
7550: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
7560: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
7570: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
7580: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
7590: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
75a0: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
75b0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
75c0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
75d0: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
7600: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
7610: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
7620: 20 74 6f 70 3b 0a 20 20 0a 20 20 61 73 73 65 72   top;.  .  asser
7630: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
7640: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
7650: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
7660: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
7670: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
7680: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7690: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
76a0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
76b0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
76c0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
76d0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
76e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
76f0: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
7700: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
7710: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
7720: 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
7730: 20 74 68 65 20 73 70 61 63 65 20 62 65 74 77 65   the space betwe
7740: 65 6e 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73  en the cell-offs
7750: 65 74 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  et array and the
7760: 20 0a 20 20 2a 2a 20 63 65 6c 6c 2d 63 6f 6e 74   .  ** cell-cont
7770: 65 6e 74 20 61 72 65 61 20 69 73 20 67 72 65 61  ent area is grea
7780: 74 65 72 20 74 68 61 6e 20 6e 42 79 74 65 20 62  ter than nByte b
7790: 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ytes..  */.  ass
77a0: 65 72 74 28 20 6e 42 79 74 65 20 3c 3d 20 28 0a  ert( nByte <= (.
77b0: 20 20 20 20 20 20 67 65 74 32 62 79 74 65 28 26        get2byte(&
77c0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 2d 28 68 64  data[hdr+5])-(hd
77d0: 72 2b 38 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66  r+8+(pPage->leaf
77e0: 3f 30 3a 34 29 2b 32 2a 67 65 74 32 62 79 74 65  ?0:4)+2*get2byte
77f0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 29 0a  (&data[hdr+3])).
7800: 20 20 29 29 3b 0a 0a 20 20 70 50 61 67 65 2d 3e    ));..  pPage->
7810: 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 6e 42  nFree -= (u16)nB
7820: 79 74 65 3b 0a 20 20 6e 46 72 61 67 20 3d 20 64  yte;.  nFrag = d
7830: 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66  ata[hdr+7];.  if
7840: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
7850: 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67     defragmentPag
7860: 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
7870: 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
7880: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
7890: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
78a0: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
78b0: 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20   to satisfy .   
78c0: 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e   ** the request.
78d0: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
78e0: 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65  is made from the
78f0: 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74   first free slot
7900: 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
7910: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72  list that is lar
7920: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63  ge enough to acc
7930: 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20  omadate it..    
7940: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  */.    int pc, a
7950: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
7960: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
7970: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
7980: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
7990: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
79a0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
79b0: 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f  ta[pc+2]);     /
79c0: 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73  * Size of free s
79d0: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
79e0: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
79f0: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
7a00: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
7a10: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
7a20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
7a30: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
7a40: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
7a50: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
7a60: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
7a70: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
7a80: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
7a90: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
7aa0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
7ab0: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
7ac0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
7ad0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
7ae0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
7af0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7b00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
7b10: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
7b20: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
7b30: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
7b40: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
7b50: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
7b60: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
7b70: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
7b80: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
7b90: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
7ba0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
7bb0: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
7bc0: 6e 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20  n pc + x;.      
7bd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
7be0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
7bf0: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
7c00: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
7c10: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
7c20: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
7c30: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
7c40: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  .  */.  top = ge
7c50: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7c60: 2b 35 5d 29 20 2d 20 6e 42 79 74 65 3b 0a 20 20  +5]) - nByte;.  
7c70: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
7c80: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
7c90: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
7ca0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
7cb0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
7cc0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
7cd0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
7ce0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
7cf0: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
7d00: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
7d10: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
7d20: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
7d30: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
7d40: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
7d50: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
7d60: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
7d70: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
7d80: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
7d90: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
7da0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
7db0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
7dc0: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
7dd0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
7de0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
7df0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
7e00: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73  egin, hdr;.  uns
7e10: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7e20: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
7e30: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
7e40: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
7e50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7e60: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
7e70: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
7e80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
7e90: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
7ea0: 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
7eb0: 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73  af?0:4) );.  ass
7ec0: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
7ed0: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
7ee0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
7ef0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7f00: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
7f10: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
7f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
7f30: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
7f40: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
7f50: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
7f60: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
7f70: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
7f80: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
7f90: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
7fa0: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
7fb0: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
7fc0: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
7fd0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7fe0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
7ff0: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
8000: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
8010: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
8020: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
8030: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
8040: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20  blocks */.  hdr 
8050: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
8060: 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72  et;.  addr = hdr
8070: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
8080: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
8090: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c  e(&data[addr]))<
80a0: 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e  start && pbegin>
80b0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
80c0: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
80d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
80e0: 34 20 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  4 );.    if( pbe
80f0: 67 69 6e 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20  gin<=addr ) {.  
8100: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8110: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8120: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d      }.    addr =
8130: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69   pbegin;.  }.  i
8140: 66 20 28 20 70 62 65 67 69 6e 3e 70 50 61 67 65  f ( pbegin>pPage
8150: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8160: 65 2d 34 20 29 20 7b 0a 20 20 20 20 72 65 74 75  e-4 ) {.    retu
8170: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8180: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
8190: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
81a0: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
81b0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
81c0: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
81d0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
81e0: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
81f0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
8200: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
8210: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
8220: 46 72 65 65 20 2b 3d 20 28 75 31 36 29 73 69 7a  Free += (u16)siz
8230: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
8240: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
8250: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
8260: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
8270: 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  set + 1;.  while
8280: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
8290: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
82a0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
82b0: 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b  pnext, psize, x;
82c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
82d0: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
82e0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
82f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
8300: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
8310: 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65  pnext = get2byte
8320: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b  (&data[pbegin]);
8330: 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74  .    psize = get
8340: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
8350: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  in+2]);.    if( 
8360: 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b  pbegin + psize +
8370: 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70   3 >= pnext && p
8380: 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
8390: 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74  int frag = pnext
83a0: 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65   - (pbegin+psize
83b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72  );.      if( (fr
83c0: 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28  ag<0) || (frag>(
83d0: 69 6e 74 29 64 61 74 61 5b 70 50 61 67 65 2d 3e  int)data[pPage->
83e0: 68 64 72 4f 66 66 73 65 74 2b 37 5d 29 20 29 7b  hdrOffset+7]) ){
83f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8400: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8410: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
8420: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
8430: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 28  drOffset+7] -= (
8440: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
8450: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8460: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
8470: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
8480: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
8490: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
84a0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
84b0: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
84c0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
84d0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
84e0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
84f0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
8500: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
8510: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
8520: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
8530: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
8540: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
8550: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
8560: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
8570: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
8580: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
8590: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
85a0: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
85b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
85c0: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
85d0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
85e0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
85f0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
8600: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8610: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
8620: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
8630: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
8640: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
8650: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
8660: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
8670: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
8680: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
8690: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
86a0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
86b0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
86c0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
86d0: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
86e0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
86f0: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
8700: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
8710: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
8720: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
8730: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
8740: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
8750: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
8760: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
8770: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
8780: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
8790: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
87a0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
87b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
87c0: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
87d0: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
87e0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
87f0: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
8800: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
8810: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
8820: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
8830: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
8840: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
8850: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
8860: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
8870: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
8880: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
8890: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
88a0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
88b0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
88c0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
88d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
88e0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
88f0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8900: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
8910: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
8920: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
8930: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
8940: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
8950: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
8960: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
8970: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
8980: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
8990: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
89a0: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
89b0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
89c0: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
89d0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
89e0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
89f0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
8a00: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
8a10: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
8a20: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
8a30: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
8a40: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
8a50: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
8a60: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
8a70: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
8a80: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
8a90: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
8aa0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
8ab0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
8ac0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
8ad0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
8ae0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
8af0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8b00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8b10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8b20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
8b30: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
8b40: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
8b50: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
8b60: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
8b70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
8b80: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
8b90: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
8ba0: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
8bb0: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
8bc0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
8bd0: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
8be0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
8bf0: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
8c00: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
8c10: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
8c20: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
8c30: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
8c40: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
8c50: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
8c60: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
8c70: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
8c80: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
8c90: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d  3BtreeInitPage(M
8ca0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
8cb0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8cc0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
8cd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8ce0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8cf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8d00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8d10: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
8d20: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
8d30: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
8d40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
8d50: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
8d60: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
8d70: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8d80: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
8d90: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
8da0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
8db0: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
8dc0: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
8dd0: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8df0: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
8e00: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
8e10: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
8e20: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
8e30: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8e40: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
8e50: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8e60: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
8e70: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
8e80: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
8e90: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
8ea0: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
8eb0: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
8ec0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75  ructure */.    u
8ed0: 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  16 usableSize;  
8ee0: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
8ef0: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
8f00: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
8f10: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
8f20: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
8f30: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
8f40: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
8f50: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  inter */.    u16
8f60: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
8f70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
8f80: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
8f90: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
8fa0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
8fb0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
8fc0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
8fd0: 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70  t area */..    p
8fe0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
8ff0: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
9000: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
9010: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
9020: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
9030: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
9040: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
9050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9060: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
9070: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
9080: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
9090: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36  ->pageSize<=3276
90a0: 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  8 );.    pPage->
90b0: 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e  maskPage = pBt->
90c0: 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20  pageSize - 1;.  
90d0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
90e0: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
90f0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
9100: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
9110: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
9120: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
9130: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
9140: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70  e->leaf;.    top
9150: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9160: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
9170: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
9180: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9190: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
91a0: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
91b0: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
91c0: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
91d0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
91e0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
91f0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
9200: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
9210: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9220: 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  PT;.    }..    /
9230: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
9240: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
9250: 74 20 63 61 75 73 65 20 75 73 65 20 74 6f 20 72  t cause use to r
9260: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
9270: 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  .    ** of page 
9280: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
9290: 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ell.  .    **.  
92a0: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
92b0: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
92c0: 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
92d0: 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
92e0: 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61  xtends.    ** pa
92f0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
9300: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
9310: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
9320: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
9330: 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69     ** returned i
9340: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a  f it does..    *
9350: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
9360: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9370: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
9380: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
9390: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 2f   iCellFirst;   /
93a0: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
93b0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
93c0: 20 20 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c        int iCellL
93d0: 61 73 74 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20  ast;    /* Last 
93e0: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e  possible cell in
93f0: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
9400: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
9410: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
9420: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
9430: 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ray */.      int
9440: 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f   sz;           /
9450: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
9460: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 43 65 6c 6c   */..      iCell
9470: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
9480: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
9490: 65 6c 6c 3b 0a 20 20 20 20 20 20 69 43 65 6c 6c  ell;.      iCell
94a0: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
94b0: 65 20 2d 20 34 3b 0a 20 20 20 20 20 20 69 66 28  e - 4;.      if(
94c0: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
94d0: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
94e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
94f0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
9500: 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67  {.        pc = g
9510: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  et2byte(&data[ce
9520: 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a  llOffset+i*2]);.
9530: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
9540: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
9550: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
9560: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9570: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9580: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
9590: 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
95a0: 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61  zePtr(pPage, &da
95b0: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20  ta[pc]);.       
95c0: 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
95d0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
95e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
95f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9600: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9610: 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a  .    }  .#endif.
9620: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
9630: 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
9640: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
9650: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
9660: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9670: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
9680: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
9690: 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  op;.    while( p
96a0: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36  c>0 ){.      u16
96b0: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
96c0: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
96d0: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
96e0: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20    /* Free block 
96f0: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
9700: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
9710: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9720: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
9730: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
9740: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
9750: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
9760: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
9770: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
9780: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
9790: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
97a0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
97b0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
97c0: 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  ccending order *
97d0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
97e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
97f0: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
9800: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
9810: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
9820: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
9830: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
9840: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
9850: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
9860: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
9870: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
9880: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
9890: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
98a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
98b0: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
98c0: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
98d0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
98e0: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
98f0: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
9900: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
9910: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
9920: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
9930: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
9940: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
9950: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
9960: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
9970: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
9980: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
9990: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
99a0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
99b0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
99c0: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
99d0: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
99e0: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
99f0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
9a00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9a10: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
9a20: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
9a30: 65 20 3d 20 6e 46 72 65 65 20 2d 20 28 63 65 6c  e = nFree - (cel
9a40: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
9a50: 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 23 69 66 20  e->nCell);..#if 
9a60: 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  0.  /* Check tha
9a70: 74 20 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74  t all the offset
9a80: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66  s in the cell of
9a90: 66 73 65 74 20 61 72 72 61 79 20 61 72 65 20 77  fset array are w
9aa0: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20  ithin range. .  
9ab0: 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e  ** .  ** Omittin
9ac0: 67 20 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e  g this consisten
9ad0: 63 79 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69  cy check and usi
9ae0: 6e 67 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61  ng the pPage->ma
9af0: 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a  skPage mask.  **
9b00: 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72   to prevent over
9b10: 72 75 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65  running the page
9b20: 20 62 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43   buffer in findC
9b30: 65 6c 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e  ell() results in
9b40: 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72   a.  ** 2.5% per
9b50: 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20  formance gain.. 
9b60: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a   */.  {.    u8 *
9b70: 70 4f 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pOff;        /* 
9b80: 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f  Iterator used to
9b90: 20 63 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20   check all cell 
9ba0: 6f 66 66 73 65 74 73 20 61 72 65 20 69 6e 20 72  offsets are in r
9bb0: 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ange */.    u8 *
9bc0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  pEnd;        /* 
9bd0: 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f  Pointer to end o
9be0: 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72  f cell offset ar
9bf0: 72 61 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61  ray */.    u8 ma
9c00: 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  sk;         /* M
9c10: 61 73 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74  ask of bits that
9c20: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e   must be zero in
9c30: 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66   MSB of cell off
9c40: 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b  sets */.    mask
9c50: 20 3d 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e   = ~(((u8)(pBt->
9c60: 70 61 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29  pageSize>>8))-1)
9c70: 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61  ;.    pEnd = &da
9c80: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
9c90: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b  pPage->nCell*2];
9ca0: 0a 20 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64  .    for(pOff=&d
9cb0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
9cc0: 20 70 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21   pOff!=pEnd && !
9cd0: 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20  ((*pOff)&mask); 
9ce0: 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66  pOff+=2);.    if
9cf0: 28 20 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a  ( pOff!=pEnd ){.
9d00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9d10: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9d20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
9d30: 69 66 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  if..    pPage->i
9d40: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
9d50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9d60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
9d70: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
9d80: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
9d90: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
9da0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
9db0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
9dc0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
9dd0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
9de0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
9df0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9e00: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
9e10: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
9e20: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
9e30: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
9e40: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
9e50: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
9e60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9e70: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
9e80: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
9e90: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
9ea0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9eb0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
9ec0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
9ed0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
9ee0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9ef0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
9f00: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
9f10: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
9f20: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9f30: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9f40: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9f50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9f60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
9f70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d  >mutex) );.  /*m
9f80: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
9f90: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
9fa0: 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20  Size - hdr);*/. 
9fb0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
9fc0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
9fd0: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a  t = hdr + 8 + 4*
9fe0: 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46  ((flags&PTF_LEAF
9ff0: 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65  )==0 ?1:0);.  me
a000: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
a010: 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
a020: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
a030: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
a040: 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
a050: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
a060: 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73  >nFree = pBt->us
a070: 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
a080: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
a090: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
a0a0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
a0b0: 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65  t = hdr;.  pPage
a0c0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
a0d0: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  irst;.  pPage->n
a0e0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
a0f0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
a100: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
a110: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37  t->pageSize<=327
a120: 36 38 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  68 );.  pPage->m
a130: 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70  askPage = pBt->p
a140: 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70  ageSize - 1;.  p
a150: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
a160: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
a170: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
a180: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
a190: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
a1a0: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
a1b0: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
a1c0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
a1d0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
a1e0: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
a1f0: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
a200: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
a210: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
a220: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
a230: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
a240: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
a250: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
a260: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
a270: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
a280: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
a290: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
a2a0: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
a2b0: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
a2c0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
a2d0: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
a2e0: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
a2f0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
a300: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
a310: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
a320: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
a330: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
a340: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
a350: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
a360: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
a370: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
a380: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
a390: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
a3a0: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
a3b0: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
a3c0: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
a3d0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
a3e0: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
a3f0: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
a400: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
a410: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
a420: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
a430: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
a440: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
a450: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
a460: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
a470: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
a480: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
a490: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
a4a0: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
a4b0: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
a4c0: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
a4d0: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
a4e0: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
a4f0: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
a500: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
a510: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
a520: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
a530: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
a540: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
a550: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a560: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
a570: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
a580: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
a590: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
a5a0: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
a5b0: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  eter */.  int no
a5c0: 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f  Content        /
a5d0: 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61  * Do not load pa
a5e0: 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72  ge content if tr
a5f0: 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
a600: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
a610: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
a620: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a630: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
a640: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
a650: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
a660: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
a670: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
a680: 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
a690: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a6a0: 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
a6b0: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
a6c0: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
a6d0: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
a6e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a6f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
a700: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
a710: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
a720: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
a730: 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
a740: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
a750: 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
a760: 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
a770: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
a780: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
a790: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
a7a0: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
a7b0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
a7c0: 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
a7d0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
a7e0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
a7f0: 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
a800: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a810: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
a820: 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
a830: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
a840: 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
a850: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
a860: 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
a870: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
a880: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
a890: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
a8a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
a8b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a8c0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a8d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
a8e0: 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
a8f0: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
a900: 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
a910: 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
a920: 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
a930: 67 6e 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75  gno pagerPagecou
a940: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
a950: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  ){.  int nPage =
a960: 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   -1;.  int rc;. 
a970: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
a980: 61 67 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73  age1 );.  rc = s
a990: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
a9a0: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
a9b0: 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73  , &nPage);.  ass
a9c0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
a9d0: 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20  OK || nPage==-1 
a9e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e  );.  return (Pgn
a9f0: 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  o)nPage;.}../*.*
aa00: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
aa10: 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
aa20: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20  initialize it.  
aa30: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
aa40: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e  is just a conven
aa50: 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72  ience wrapper ar
aa60: 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61  ound separate ca
aa70: 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
aa80: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
aa90: 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  and sqlite3Btree
aaa0: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  InitPage()..*/.s
aab0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
aac0: 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
aad0: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
aae0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
aaf0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
ab00: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
ab10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ab20: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
ab30: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
ab40: 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69  pPage     /* Wri
ab50: 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
ab60: 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ter here */.){. 
ab70: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
ab80: 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
ab90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
aba0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
abb0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
abc0: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
abd0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
abe0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20  PT_BKPT; .  }.. 
abf0: 20 2f 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20   /* It is often 
ac00: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
ac10: 65 20 70 61 67 65 20 77 65 20 77 61 6e 74 20 69  e page we want i
ac20: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  s already in cac
ac30: 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20  he..  ** If so, 
ac40: 67 65 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e  get it directly.
ac50: 20 20 54 68 69 73 20 73 61 76 65 73 20 75 73 20    This saves us 
ac60: 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63  from having to c
ac70: 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61  all.  ** pagerPa
ac80: 67 65 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b  gecount() to mak
ac90: 65 20 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77  e sure pgno is w
aca0: 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68  ithin limits, wh
acb0: 69 63 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  ich results.  **
acc0: 20 69 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c   in a measureabl
acd0: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  e performance im
ace0: 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  provements..  */
acf0: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61  .  *ppPage = pPa
ad00: 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
ad10: 6f 6b 75 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b  okup(pBt, pgno);
ad20: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
ad30: 20 20 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61      /* Page is a
ad40: 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 20  lready in cache 
ad50: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
ad60: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
ad70: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20      /* Page not 
ad80: 69 6e 20 63 61 63 68 65 2e 20 20 41 63 71 75 69  in cache.  Acqui
ad90: 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  re it. */.    if
ada0: 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  ( pgno>pagerPage
adb0: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
adc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
add0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
ade0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
adf0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
ae00: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
ae10: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  pPage, 0);.    i
ae20: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
ae30: 63 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 2a  c;.    pPage = *
ae40: 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66  ppPage;.  }.  if
ae50: 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
ae60: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
ae70: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
ae80: 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
ae90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
aea0: 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  K ){.    release
aeb0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
aec0: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
aed0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
aee0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
aef0: 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
af00: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
af10: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
af20: 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
af30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
af40: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
af50: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
af60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
af70: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  {.  if( pPage ){
af80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
af90: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
afa0: 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
afb0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61  PageRefcount(pPa
afc0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  ge->pDbPage)>1 )
afd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
afe0: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
aff0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b000: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
b010: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b020: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
b030: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
b040: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
b050: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b060: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
b070: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
b080: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
b090: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b0a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
b0b0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
b0c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
b0d0: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
b0e0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
b0f0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
b100: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
b110: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
b120: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
b130: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
b140: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
b150: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
b160: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
b170: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
b180: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
b190: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
b1a0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
b1b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b1c0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
b1d0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
b1e0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
b1f0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
b200: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
b210: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
b220: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
b230: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
b240: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
b250: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
b260: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
b270: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
b280: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
b290: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
b2a0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
b2b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
b2c0: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
b2d0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
b2e0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
b2f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b300: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
b310: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
b320: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
b330: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
b340: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
b350: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
b360: 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
b370: 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
b380: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
b390: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
b3a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
b3b0: 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
b3c0: 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
b3d0: 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
b3e0: 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
b3f0: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
b400: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
b410: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
b420: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
b430: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
b440: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
b450: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
b460: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
b470: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
b480: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 73 71  that.      ** sq
b490: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
b4a0: 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
b4b0: 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
b4c0: 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
b4d0: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
b4e0: 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
b4f0: 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
b500: 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
b510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
b520: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
b530: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
b540: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
b550: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
b560: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
b570: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
b580: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
b590: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
b5a0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
b5b0: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
b5c0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
b5d0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
b5e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b5f0: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
b600: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
b610: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
b620: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
b630: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
b640: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
b650: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
b660: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
b670: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b680: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
b690: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
b6a0: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
b6b0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
b6c0: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
b6d0: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
b6e0: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
b6f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
b700: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
b710: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
b720: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
b730: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
b740: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
b750: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
b760: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
b770: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
b780: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
b790: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
b7a0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
b7b0: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
b7c0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
b7d0: 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
b7e0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
b7f0: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
b800: 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
b810: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
b820: 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
b830: 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
b840: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
b850: 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
b860: 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
b870: 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
b880: 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
b890: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
b8a0: 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
b8b0: 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
b8c0: 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
b8d0: 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
b8e0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
b8f0: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
b900: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
b910: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
b920: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
b930: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
b940: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
b950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
b960: 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
b970: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
b980: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
b990: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
b9a0: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
b9b0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
b9c0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
b9d0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
b9e0: 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
b9f0: 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
ba00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
ba10: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
ba20: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
ba30: 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
ba40: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
ba50: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
ba60: 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65  * The VFS to use
ba70: 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20   for this btree 
ba80: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
ba90: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
baa0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
bab0: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
bac0: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
bad0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
bae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
baf0: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
bb00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
bb10: 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
bb20: 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
bb30: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
bb40: 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
bb50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
bb60: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
bb70: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
bb80: 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
bb90: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
bba0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
bbb0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
bbc0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
bbd0: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
bbe0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
bbf0: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
bc00: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
bc10: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
bc20: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
bc30: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
bc40: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
bc50: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
bc60: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
bc70: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
bc80: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
bc90: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
bca0: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
bcb0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
bcc0: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
bcd0: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
bce0: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
bcf0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
bd00: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
bd10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bd20: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
bd30: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
bd40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
bd50: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
bd60: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
bd70: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
bd80: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
bd90: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
bda0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
bdb0: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
bdc0: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
bdd0: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
bde0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
bdf0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
be00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
be10: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
be20: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66  mutex) );..  pVf
be30: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
be40: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
be50: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
be60: 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
be70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
be80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
be90: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
bea0: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
beb0: 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65  b = db;..#if !de
bec0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bed0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
bee0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
bef0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
bf00: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
bf10: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
bf20: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
bf30: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
bf40: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
bf50: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
bf60: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
bf70: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
bf80: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
bf90: 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20  =0 && zFilename 
bfa0: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
bfb0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
bfc0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
bfd0: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
bfe0: 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  d ){.      int n
bff0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
c000: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
c010: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
c020: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
c030: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
c040: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
c050: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
c060: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20   *mutexShared;. 
c070: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
c080: 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e   = 1;.      db->
c090: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
c0a0: 53 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20  SharedCache;.   
c0b0: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
c0c0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
c0d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
c0e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
c0f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c100: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
c110: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
c120: 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
c130: 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  me, nFullPathnam
c140: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
c150: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  );.      mutexOp
c160: 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
c170: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
c180: 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
c190: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
c1a0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
c1b0: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
c1c0: 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
c1d0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
c1e0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
c1f0: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
c200: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
c210: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
c220: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  );.      for(pBt
c230: 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
c240: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
c250: 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
c260: 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
c270: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c280: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
c290: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
c2a0: 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
c2b0: 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
c2c0: 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
c2d0: 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
c2e0: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
c2f0: 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
c300: 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
c310: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
c320: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
c330: 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
c340: 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
c350: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
c360: 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
c370: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
c380: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
c390: 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
c3a0: 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
c3b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
c3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
c3d0: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
c3e0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
c3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
c400: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
c410: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
c420: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c430: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c450: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
c470: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
c480: 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
c490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
c4a0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
c4b0: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
c4c0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
c4d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c4e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c4f0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
c500: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
c510: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
c520: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
c530: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
c540: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
c550: 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
c560: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
c570: 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
c580: 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
c590: 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
c5a0: 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
c5b0: 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
c5c0: 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
c5d0: 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
c5e0: 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
c5f0: 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
c600: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
c610: 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
c620: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
c630: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
c640: 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
c650: 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
c660: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
c670: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
c680: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
c690: 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
c6a0: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
c6b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
c6c0: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
c6d0: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
c6e0: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
c6f0: 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
c700: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
c710: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
c720: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
c730: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
c740: 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
c750: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
c760: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
c770: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
c780: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
c790: 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
c7a0: 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
c7b0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
c7c0: 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
c7d0: 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
c7e0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
c7f0: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
c800: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
c810: 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
c820: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
c830: 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
c840: 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
c850: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
c860: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
c870: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
c880: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c890: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
c8a0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
c8b0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
c8c0: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
c8d0: 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
c8e0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
c910: 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
c920: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  gs);.    if( rc=
c930: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c940: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c950: 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
c960: 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
c970: 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
c980: 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
c990: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
c9a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c9b0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
c9c0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
c9d0: 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
c9e0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
c9f0: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
ca00: 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
ca10: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
ca20: 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
ca30: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
ca40: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
ca50: 65 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e  etReiniter(pBt->
ca60: 70 50 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e  pPager, pageRein
ca70: 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43  it);.    pBt->pC
ca80: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
ca90: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
caa0: 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
cab0: 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  y = sqlite3Pager
cac0: 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
cad0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74  pPager);.    pBt
cae0: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74  ->pageSize = get
caf0: 32 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  2byte(&zDbHeader
cb00: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  [16]);.    if( p
cb10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
cb20: 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
cb30: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
cb40: 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
cb50: 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
cb60: 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
cb70: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
cb80: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
cb90: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
cba0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
cbb0: 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
cbc0: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
cbd0: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
cbe0: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
cbf0: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
cc00: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
cc10: 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
cc20: 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
cc30: 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
cc40: 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
cc50: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
cc60: 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
cc70: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
cc80: 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
cc90: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
cca0: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
ccb0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
ccc0: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
ccd0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
cce0: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
ccf0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
cd00: 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
cd10: 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
cd20: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
cd30: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
cd40: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
cd50: 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
cd60: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
cd70: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
cd80: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
cd90: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
cda0: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
cdb0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
cdc0: 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
cdd0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
cde0: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
cdf0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ce00: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
ce10: 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
ce20: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
ce30: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
ce40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ce50: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
ce60: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
ce70: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
ce80: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
ce90: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
cea0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
ceb0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
cec0: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
ced0: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
cee0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
cef0: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
cf00: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
cf10: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
cf20: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
cf30: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
cf40: 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
cf50: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
cf60: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
cf70: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
cf80: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
cf90: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
cfa0: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
cfb0: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
cfc0: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
cfd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
cfe0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
cff0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d000: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
d010: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
d020: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
d030: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
d040: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
d050: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
d060: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
d070: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
d080: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
d090: 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ed;.      pBt->n
d0a0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  Ref = 1;.      m
d0b0: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
d0c0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
d0d0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
d0e0: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
d0f0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
d100: 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
d110: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
d120: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
d130: 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
d140: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
d150: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
d160: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
d170: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
d180: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
d190: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
d1a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
d1b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
d1c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
d1d0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
d1e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d1f0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d200: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
d210: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
d220: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
d230: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
d240: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
d250: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
d260: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
d270: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
d280: 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
d290: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
d2a0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
d2b0: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
d2c0: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
d2d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d2e0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
d2f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
d300: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
d310: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
d320: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
d330: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
d340: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
d350: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
d360: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
d370: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
d380: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
d390: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
d3a0: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
d3b0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
d3c0: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
d3d0: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
d3e0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
d3f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
d400: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
d410: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
d420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d430: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
d440: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
d450: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
d460: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
d470: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
d480: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
d490: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
d4a0: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
d4b0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
d4c0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
d4e0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
d4f0: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
d500: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
d510: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
d520: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
d530: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
d540: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
d550: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
d560: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
d570: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d580: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
d590: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
d5a0: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
d5b0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
d5c0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
d5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
d5e0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
d5f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d600: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
d610: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
d620: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
d630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d640: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
d650: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
d660: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
d670: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d680: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
d690: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
d6a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
d6b0: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
d6c0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
d6d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
d6e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
d6f0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
d700: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
d710: 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
d720: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
d730: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d740: 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
d750: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
d760: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
d770: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d780: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
d790: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
d7a0: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
d7b0: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
d7c0: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
d7d0: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
d7e0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
d7f0: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
d800: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
d810: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
d820: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
d830: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
d840: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
d850: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
d860: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
d870: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
d880: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
d890: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
d8a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d8b0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
d8c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
d8d0: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
d8e0: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
d8f0: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
d900: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d910: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
d920: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
d930: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
d940: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
d950: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
d960: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
d970: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
d980: 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
d990: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
d9a0: 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
d9b0: 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
d9c0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
d9d0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
d9e0: 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
d9f0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
da00: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
da10: 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
da20: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
da30: 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
da40: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
da50: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
da60: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
da70: 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
da80: 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
da90: 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
daa0: 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
dab0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
dac0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
dad0: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
dae0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
daf0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
db00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
db10: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
db20: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
db30: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
db40: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
db50: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
db60: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
db70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
db80: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
db90: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
dba0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
dbb0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
dbc0: 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
dbd0: 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
dbe0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
dbf0: 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
dc00: 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
dc10: 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
dc20: 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
dc30: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
dc40: 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
dc50: 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
dc60: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
dc70: 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
dc80: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
dc90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
dca0: 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
dcb0: 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
dcc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
dcd0: 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
dce0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
dcf0: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
dd00: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
dd10: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
dd20: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
dd30: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
dd40: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
dd50: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
dd60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dd70: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
dd80: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
dd90: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
dda0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
ddb0: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
ddc0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
ddd0: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
dde0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
ddf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
de00: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
de10: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
de20: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
de30: 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
de40: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
de50: 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
de60: 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
de70: 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
de80: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
de90: 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
dea0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
deb0: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
dec0: 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
ded0: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
dee0: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
def0: 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
df00: 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
df10: 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
df20: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
df30: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
df40: 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
df50: 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
df60: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
df70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
df80: 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
df90: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
dfa0: 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
dfb0: 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
dfc0: 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
dfd0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
dfe0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
dff0: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
e000: 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
e010: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
e020: 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
e030: 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
e040: 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
e050: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
e060: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
e070: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
e080: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
e090: 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
e0a0: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
e0b0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
e0c0: 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
e0d0: 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
e0e0: 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
e0f0: 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
e100: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
e110: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
e120: 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
e130: 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
e140: 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
e150: 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
e160: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
e170: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
e180: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
e190: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
e1a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
e1b0: 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
e1c0: 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
e1d0: 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
e1e0: 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
e1f0: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
e200: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d  qlite3_free(pBt-
e210: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
e220: 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
e230: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
e240: 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
e250: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e260: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
e270: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
e280: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
e290: 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
e2a0: 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
e2b0: 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
e2c0: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
e2d0: 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
e2e0: 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
e2f0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
e300: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
e310: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
e320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
e340: 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
e350: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
e360: 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
e370: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
e380: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
e390: 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
e3a0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
e3b0: 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
e3c0: 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
e3d0: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
e3e0: 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
e3f0: 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
e400: 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
e410: 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
e420: 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
e430: 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
e440: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
e450: 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
e460: 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
e470: 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
e480: 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
e490: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
e4a0: 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
e4b0: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
e4c0: 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
e4d0: 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
e4e0: 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
e4f0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
e500: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
e510: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
e520: 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
e530: 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
e540: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
e550: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
e560: 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
e570: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
e580: 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
e590: 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
e5a0: 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
e5b0: 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
e5c0: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
e5d0: 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
e5e0: 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
e5f0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
e600: 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
e610: 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
e620: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e630: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
e640: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e650: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
e660: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
e670: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
e680: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
e690: 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
e6a0: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
e6b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
e6c0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
e6d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e6e0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
e6f0: 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
e700: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
e710: 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
e720: 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
e730: 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
e740: 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
e750: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
e760: 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
e770: 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
e780: 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
e790: 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
e7a0: 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
e7b0: 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
e7c0: 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
e7d0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
e7e0: 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
e7f0: 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
e800: 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
e810: 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
e820: 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
e830: 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
e840: 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
e850: 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
e860: 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
e870: 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
e880: 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
e890: 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
e8a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e8b0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
e8c0: 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
e8d0: 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
e8e0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c  (Btree *p, int l
e8f0: 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79  evel, int fullSy
e900: 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  nc){.  BtShared 
e910: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
e920: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e930: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
e940: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
e950: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e960: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
e970: 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
e980: 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
e990: 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b  evel, fullSync);
e9a0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
e9b0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
e9c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
e9d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
e9e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
e9f0: 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73  given btree is s
ea00: 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76  et to safety lev
ea10: 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a  el 1.  In other.
ea20: 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  ** words, return
ea30: 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63   TRUE if no sync
ea40: 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65  () occurs on the
ea50: 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a   disk files..*/.
ea60: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ea70: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72  SyncDisabled(Btr
ea80: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
ea90: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
eaa0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
eab0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
eac0: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
ead0: 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71  mutex) );  .  sq
eae0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
eaf0: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
eb00: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
eb10: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
eb20: 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42  e3PagerNosync(pB
eb30: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71  t->pPager);.  sq
eb40: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
eb50: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
eb60: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
eb70: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
eb80: 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
eb90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
eba0: 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
ebb0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
ebc0: 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
ebd0: 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
ebe0: 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
ebf0: 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
ec00: 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
ec10: 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
ec20: 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
ec30: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
ec40: 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
ec50: 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
ec60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
ec70: 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
ec80: 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
ec90: 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
eca0: 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
ecb0: 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
ecc0: 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
ecd0: 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
ece0: 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
ecf0: 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
ed00: 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
ed10: 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
ed20: 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
ed30: 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
ed40: 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
ed50: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
ed60: 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
ed70: 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
ed80: 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
ed90: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
eda0: 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
edb0: 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
edc0: 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
edd0: 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
ede0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
edf0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
ee00: 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
ee10: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
ee20: 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
ee30: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
ee40: 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
ee50: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
ee60: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
ee70: 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
ee80: 65 20 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  e pageSizeFixed 
ee90: 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
eea0: 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
eeb0: 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
eec0: 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
eed0: 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
eee0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
eef0: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
ef00: 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
ef10: 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
ef20: 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
ef30: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
ef40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
ef50: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
ef60: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
ef70: 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
ef80: 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
ef90: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
efa0: 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
efb0: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29  >pageSizeFixed )
efc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
efd0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
efe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
eff0: 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
f000: 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
f010: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
f020: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
f030: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
f040: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
f050: 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
f060: 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
f070: 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
f080: 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
f090: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
f0a0: 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
f0b0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
f0c0: 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
f0d0: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
f0e0: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
f0f0: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
f100: 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
f110: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
f120: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
f130: 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
f140: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
f150: 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  pBt);.    rc = s
f160: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
f170: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
f180: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
f190: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  ze);.  }.  pBt->
f1a0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
f1b0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
f1c0: 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
f1d0: 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61  ( iFix ) pBt->pa
f1e0: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
f1f0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
f200: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
f210: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
f220: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
f230: 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
f240: 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
f250: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
f260: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
f270: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
f280: 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
f290: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
f2a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
f2b0: 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
f2c0: 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
f2d0: 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
f2e0: 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
f2f0: 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
f300: 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
f310: 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
f320: 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
f330: 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
f340: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f350: 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
f360: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
f370: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
f380: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
f390: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f3a0: 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
f3b0: 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
f3c0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f3d0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
f3e0: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
f3f0: 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
f400: 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
f410: 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
f420: 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
f430: 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
f440: 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
f450: 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
f460: 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
f470: 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
f480: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
f490: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
f4a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
f4b0: 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
f4c0: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
f4d0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
f4e0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
f4f0: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
f500: 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
f510: 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
f520: 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
f530: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
f540: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
f550: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
f560: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
f570: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
f580: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f590: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
f5a0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
f5b0: 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
f5c0: 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
f5d0: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
f5e0: 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
f5f0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
f600: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
f610: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
f620: 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
f630: 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
f640: 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
f650: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
f660: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
f670: 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
f680: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
f690: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
f6a0: 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
f6b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f6c0: 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
f6d0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
f6e0: 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
f6f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f700: 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
f710: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
f720: 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
f730: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
f740: 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
f750: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
f760: 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
f770: 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
f780: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
f790: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
f7a0: 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a  Fixed && (av ?1:
f7b0: 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
f7c0: 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
f7d0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
f7e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
f7f0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
f800: 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
f810: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
f820: 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
f830: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
f840: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
f850: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
f860: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
f870: 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
f880: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
f890: 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
f8a0: 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
f8b0: 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
f8c0: 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
f8d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
f8e0: 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
f8f0: 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
f900: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f910: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
f920: 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
f930: 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
f940: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
f950: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
f960: 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
f970: 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
f980: 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
f990: 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
f9a0: 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
f9b0: 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
f9c0: 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
f9d0: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
f9e0: 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
f9f0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
fa00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
fa10: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
fa20: 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
fa30: 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
fa40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
fa50: 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
fa60: 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
fa70: 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
fa80: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
fa90: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
faa0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
fab0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
fac0: 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
fad0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
fae0: 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
faf0: 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
fb00: 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
fb10: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
fb20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
fb30: 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
fb40: 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
fb50: 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
fb60: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
fb70: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
fb80: 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
fb90: 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
fba0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
fbb0: 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  1;.  int nPage;.
fbc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fbd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
fbe0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
fbf0: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
fc00: 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
fc10: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
fc20: 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
fc30: 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
fc40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
fc50: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
fc60: 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
fc70: 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
fc80: 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
fc90: 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
fca0: 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
fcb0: 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
fcc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
fcd0: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
fce0: 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
fcf0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
fd00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
fd10: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
fd20: 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  led;.  }else if(
fd30: 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
fd40: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  int pageSize;.  
fd50: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
fd60: 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
fd70: 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
fd80: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
fd90: 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28  _NOTADB;.    if(
fda0: 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
fdb0: 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
fdc0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
fdd0: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
fde0: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
fdf0: 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
fe00: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61  {.      pBt->rea
fe10: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dOnly = 1;.    }
fe20: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
fe30: 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
fe40: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
fe50: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
fe60: 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
fe70: 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
fe80: 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  n must be exactl
fe90: 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20  y 25%.  And the 
fea0: 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65  minimum.    ** e
feb0: 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
fec0: 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66   must be 12.5% f
fed0: 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74  or both leaf-dat
fee0: 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64  a and non-leaf-d
fef0: 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ata..    ** The 
ff00: 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
ff10: 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
ff20: 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
ff30: 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
ff40: 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
ff50: 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
ff60: 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
ff70: 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
ff80: 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
ff90: 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
ffa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
ffb0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
ffc0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ed;.    }.    pa
ffd0: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
ffe0: 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20  e(&page1[16]);. 
fff0: 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
10000 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
10010 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31  0 || pageSize<51
10020 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51  2 ||.        (SQ
10030 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
10040 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67 65  ZE<32768 && page
10050 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10060 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29  PAGE_SIZE).    )
10070 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
10080 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
10090 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
100a0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
100b0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
100c0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
100d0 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
100e0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d    if( pageSize!=
100f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
10100 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
10110 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
10120 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
10130 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
10140 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
10150 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
10160 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
10170 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
10180 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
10190 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
101a0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
101b0 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
101c0 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
101d0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
101e0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
101f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
10200 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
10210 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
10220 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
10230 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
10240 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
10250 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
10260 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
10270 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
10280 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61  eSize = (u16)usa
10290 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
102a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
102b0 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
102c0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
102d0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
102e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
102f0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
10300 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
10310 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
10320 66 28 20 72 63 20 29 20 67 6f 74 6f 20 70 61 67  f( rc ) goto pag
10330 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
10340 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10350 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
10360 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
10370 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <500 ){.      go
10380 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
10390 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
103a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
103b0 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
103c0 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
103d0 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65  ze = (u16)usable
103e0 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
103f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
10400 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
10410 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
10420 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
10430 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
10440 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
10450 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
10460 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
10470 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
10480 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
10490 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
104a0 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
104b0 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
104c0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
104d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
104e0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
104f0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
10500 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
10510 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
10520 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
10530 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
10540 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
10550 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
10560 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
10570 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
10580 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
10590 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
105a0 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
105b0 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
105c0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
105d0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
105e0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
105f0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
10600 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
10610 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
10620 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
10630 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
10640 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65  yte poiner, a he
10650 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
10660 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
10670 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
10680 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
10690 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
106a0 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
106b0 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
106c0 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
106d0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
106e0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
106f0 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
10700 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
10710 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
10720 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
10730 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78  - 23;.  pBt->max
10740 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62  Leaf = pBt->usab
10750 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70  leSize - 35;.  p
10760 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70  Bt->minLeaf = (p
10770 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
10780 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*32/255 - 23;.
10790 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
107a0 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
107b0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
107c0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
107d0 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65  1 = pPage1;.  re
107e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
107f0 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
10800 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
10810 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
10820 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
10830 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10840 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10850 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b   works like lock
10860 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74  Btree() except t
10870 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f  hat it also invo
10880 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20  kes the.** busy 
10890 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72  callback if ther
108a0 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e is lock conten
108b0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
108c0 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  int lockBtreeWit
108d0 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52  hRetry(Btree *pR
108e0 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ef){.  int rc = 
108f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
10900 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
10910 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65  eeHoldsMutex(pRe
10920 66 29 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66  f) );.  if( pRef
10930 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
10940 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20  _NONE ){.    u8 
10950 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
10960 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
10970 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74  nsaction;.    bt
10980 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
10990 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  f);.    rc = sql
109a0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
109b0 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20  ans(pRef, 0);.  
109c0 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54    pRef->pBt->inT
109d0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54  ransaction = inT
109e0 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
109f0 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  pRef->inTrans = 
10a00 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
10a10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10a20 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d  K ){.      pRef-
10a30 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  >pBt->nTransacti
10a40 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on--;.    }.    
10a50 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
10a60 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Ref);.  }.  retu
10a70 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20  rn rc;.}.       
10a80 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
10a90 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
10aa0 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
10ab0 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
10ac0 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
10ad0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
10ae0 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
10af0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
10b00 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
10b10 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
10b20 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
10b30 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
10b40 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
10b50 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
10b60 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
10b70 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
10b80 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
10b90 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  ny outstanding c
10ba0 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75  ursors, this rou
10bb0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
10bc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
10bd0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
10be0 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
10bf0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10c00 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
10c10 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
10c20 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
10c30 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
10c40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10c50 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
10c60 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
10c70 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
10c80 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
10c90 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26  t->pCursor==0 &&
10ca0 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
10cb0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
10cc0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
10cd0 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20  pBt->pPager)>=1 
10ce0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10cf0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
10d00 61 74 61 20 29 3b 0a 20 20 20 20 20 20 72 65 6c  ata );.      rel
10d10 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
10d20 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
10d30 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
10d40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
10d50 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61  reate a new data
10d60 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
10d70 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
10d80 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  age of the.** fi
10d90 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
10da0 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
10db0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10dc0 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
10dd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
10de0 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ata;.  int rc;. 
10df0 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61   int nPage;..  a
10e00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10e10 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10e20 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
10e30 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
10e40 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
10e50 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
10e60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10e70 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  || nPage>0 ){.  
10e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10e90 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
10ea0 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
10eb0 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
10ec0 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
10ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10ee0 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
10ef0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
10f00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
10f10 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
10f20 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
10f30 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
10f40 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
10f50 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
10f60 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74  =16 );.  put2byt
10f70 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74  e(&data[16], pBt
10f80 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
10f90 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
10fa0 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61  ata[19] = 1;.  a
10fb0 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
10fc0 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67  leSize<=pBt->pag
10fd0 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73  eSize && pBt->us
10fe0 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42  ableSize+255>=pB
10ff0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
11000 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28  data[20] = (u8)(
11010 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
11020 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
11030 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
11040 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
11050 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
11060 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
11070 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
11080 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
11090 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
110a0 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
110b0 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
110c0 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
110d0 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
110e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
110f0 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
11100 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
11110 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
11120 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
11130 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
11140 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
11150 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
11160 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
11170 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
11180 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
11190 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
111a0 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
111b0 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
111c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
111d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  _OK;.}../*.** At
111e0 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
111f0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
11200 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
11210 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
11220 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
11230 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
11240 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
11250 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
11260 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
11270 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
11280 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
11290 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
112a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
112b0 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
112c0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
112d0 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
112e0 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
112f0 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
11300 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
11310 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
11320 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
11330 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
11340 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
11350 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
11360 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
11370 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
11380 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
11390 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
113a0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
113b0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
113c0 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
113d0 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
113e0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
113f0 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
11400 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
11410 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
11420 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
11430 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
11440 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
11450 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
11460 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
11470 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
11480 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
11490 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
114a0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
114b0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
114c0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
114d0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
114e0 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
114f0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
11500 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
11510 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
11520 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
11530 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
11540 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
11550 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
11560 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
11570 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
11580 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
11590 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
115a0 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
115b0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
115c0 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
115d0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
115e0 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
115f0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
11600 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
11610 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
11620 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
11630 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
11640 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
11650 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
11660 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
11670 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
11680 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
11690 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
116a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
116b0 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
116c0 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
116d0 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
116e0 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
116f0 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
11700 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
11710 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
11720 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
11730 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
11740 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
11750 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
11760 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
11770 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
11780 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
11790 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
117a0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
117b0 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
117c0 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
117d0 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
117e0 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
117f0 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
11800 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
11810 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
11820 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
11830 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
11840 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
11850 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
11860 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
11870 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11880 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
11890 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
118a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c  {.  sqlite3 *pBl
118b0 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  ock = 0;.  BtSha
118c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
118d0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
118e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
118f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11900 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
11910 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
11920 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
11930 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
11940 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
11950 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
11960 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
11970 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
11980 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
11990 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
119a0 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
119b0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
119c0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
119d0 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
119e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
119f0 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
11a00 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
11a10 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
11a20 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
11a30 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
11a40 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
11a50 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
11a60 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
11a70 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b  nly && wrflag ){
11a80 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11a90 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
11aa0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
11ab0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
11ac0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
11ad0 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61  _CACHE.  /* If a
11ae0 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
11af0 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
11b00 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
11b10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
11b20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
11b30 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
11b40 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
11b50 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
11b60 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
11b70 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
11b80 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a  TE_LOCKED..  */.
11b90 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
11ba0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
11bb0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
11bc0 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64  ) || pBt->isPend
11bd0 69 6e 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63  ing ){.    pBloc
11be0 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72  k = pBt->pWriter
11bf0 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->db;.  }else if
11c00 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
11c10 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
11c20 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
11c30 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
11c40 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
11c50 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
11c60 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
11c70 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c  p ){.        pBl
11c80 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
11c90 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
11ca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11cb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11cc0 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71  pBlock ){.    sq
11cd0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
11ce0 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
11cf0 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20  lock);.    rc = 
11d00 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
11d10 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67  AREDCACHE;.    g
11d20 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
11d30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64  .  }.#endif..  d
11d40 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
11d50 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
11d60 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
11d70 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
11d80 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
11d90 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
11da0 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
11db0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
11dc0 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
11dd0 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
11de0 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
11df0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
11e00 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
11e10 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
11e20 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
11e30 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
11e40 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
11e50 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
11e60 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
11e70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
11e80 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
11e90 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
11ea0 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
11eb0 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
11ec0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
11ed0 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
11ee0 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
11ef0 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
11f00 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
11f10 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
11f20 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
11f30 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
11f40 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
11f50 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
11f60 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
11f70 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
11f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11f90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
11fa0 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
11fb0 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
11fc0 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
11fd0 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
11fe0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11ff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12000 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
12010 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
12020 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12030 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
12040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12050 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
12060 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
12070 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
12080 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
12090 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
120a0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
120b0 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
120c0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
120d0 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
120e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
120f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
12100 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
12110 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
12120 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
12130 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
12140 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
12150 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
12160 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
12170 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
12180 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
12190 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
121a0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
121b0 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23  inTrans;.    }.#
121c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
121d0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
121e0 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
121f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
12200 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
12210 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
12220 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
12230 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
12240 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29  = (u8)(wrflag>1)
12250 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
12260 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
12270 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
12280 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
12290 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
122a0 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
122b0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
122c0 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
122d0 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
122e0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
122f0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
12300 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
12310 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
12320 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
12330 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
12340 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
12350 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
12360 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
12370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12380 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
12390 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
123a0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
123b0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
123c0 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
123d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
123e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
123f0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
12400 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12410 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
12420 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
12430 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
12440 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
12450 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
12460 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
12470 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
12480 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
12490 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
124a0 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
124b0 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
124c0 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
124d0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
124e0 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
124f0 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
12500 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
12530 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
12540 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12570 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
12580 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
12590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
125b0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
125c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
125d0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
125e0 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
125f0 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
12600 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
12610 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
12620 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12630 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
12640 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
12650 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
12660 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
12670 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
12680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
12690 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
126a0 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
126b0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
126c0 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
126d0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
126e0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
126f0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
12700 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
12710 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
12720 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
12730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
12750 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
12760 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
12770 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
12780 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
12790 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
127a0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
127b0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
127c0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
127d0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
127e0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
127f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12800 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c   ) goto set_chil
12810 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
12820 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
12830 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
12840 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
12850 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
12860 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
12870 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
12880 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
12890 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
128a0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
128b0 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73  E, pgno);.  }..s
128c0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
128d0 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
128e0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
128f0 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
12900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
12910 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68  ere on pPage, wh
12920 69 63 68 20 69 73 20 67 75 61 72 61 6e 74 65 65  ich is guarantee
12930 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20  d to be a btree 
12940 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65  page, not an ove
12950 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69  rflow.** page, i
12960 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
12970 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66  age iFrom. Modif
12980 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
12990 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
129a0 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61   to.** iTo. Para
129b0 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
129c0 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
129d0 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  f pointer to be 
129e0 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a  modified, as .**
129f0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
12a00 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
12a10 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
12a20 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
12a30 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
12a40 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
12a60 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
12a70 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
12a80 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
12a90 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
12aa0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
12ab0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ad0 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
12ae0 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
12af0 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
12b00 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
12b10 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
12b20 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
12b30 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
12b40 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
12b50 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
12b60 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
12b70 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
12b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12b90 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
12ba0 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
12bb0 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
12bc0 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
12bd0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
12be0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12bf0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
12c00 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
12c10 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
12c20 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
12c30 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
12c40 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
12c50 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
12c60 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
12c70 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
12c80 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
12c90 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
12ca0 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
12cb0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
12cc0 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
12cd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
12ce0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12cf0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
12d00 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
12d10 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
12d20 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
12d30 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
12d40 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
12d50 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
12d60 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ..    sqlite3Btr
12d70 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
12d80 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
12d90 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
12da0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
12db0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
12dc0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
12dd0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
12de0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
12df0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
12e00 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
12e10 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
12e20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12e30 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
12e40 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
12e50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
12e60 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
12e70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
12e80 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
12e90 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
12ea0 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20  flow]) ){.      
12eb0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
12ec0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
12ed0 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
12ee0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12ef0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12f00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
12f10 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
12f20 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
12f30 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
12f40 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
12f50 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
12f60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12f70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12f80 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
12f90 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
12fa0 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
12fb0 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
12fc0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
12fd0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
12fe0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
12ff0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
13000 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13010 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
13020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
13030 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
13040 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
13050 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
13060 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
13070 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
13080 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
13090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
130a0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
130b0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
130c0 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
130d0 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
130e0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
130f0 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
13100 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
13110 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73  ains valid..*/.s
13120 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
13130 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
13140 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
13150 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
13160 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
13170 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
13180 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
13190 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131b0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
131c0 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
131d0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
131e0 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
131f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
13200 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
13210 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
13220 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
13230 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
13240 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
13250 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
13260 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
13270 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
13280 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
13290 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
132a0 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
132b0 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
132c0 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
132d0 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
132e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
132f0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
13300 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
13310 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
13320 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
13330 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
13340 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
13350 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
13360 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
13370 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
13380 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13390 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
133a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
133b0 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
133c0 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
133d0 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
133e0 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
133f0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
13400 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
13410 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
13420 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
13430 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
13440 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
13450 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
13460 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
13470 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
13480 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
13490 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
134a0 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
134b0 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
134c0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
134d0 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
134e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
134f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
13500 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
13510 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
13520 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
13530 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
13540 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
13550 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
13560 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
13570 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
13580 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
13590 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
135a0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
135b0 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
135c0 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
135d0 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
135e0 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
135f0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
13600 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
13610 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
13620 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
13630 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
13640 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
13650 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
13660 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
13670 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
13680 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
13690 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
136a0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
136b0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
136c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
136d0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
136e0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
136f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
13700 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
13710 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
13720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13730 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13740 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
13750 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
13760 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
13770 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
13780 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
13790 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
137a0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
137b0 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
137c0 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
137d0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
137e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
137f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13800 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
13810 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
13820 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
13830 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
13840 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
13850 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
13860 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
13870 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
13880 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
13890 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
138a0 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
138b0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
138c0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
138d0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
138e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
138f0 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
13900 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
13910 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
13920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13930 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13940 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
13950 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
13960 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
13970 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13980 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13990 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
139a0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
139b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
139c0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
139d0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
139e0 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
139f0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
13a00 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
13a10 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
13a20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13a30 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13a40 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
13a50 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
13a60 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20   iPtrPage);.    
13a70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
13a80 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
13a90 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
13aa0 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
13ab0 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
13ac0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
13ad0 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
13ae0 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
13af0 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
13b00 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
13b10 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
13b20 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
13b30 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
13b40 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
13b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
13b60 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
13b70 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
13b80 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20  therefore no.** 
13b90 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67  point in calling
13ba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
13bb0 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
13bc0 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
13bd0 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
13be0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
13bf0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
13c00 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20  rganize the .** 
13c10 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
13c20 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
13c30 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
13c40 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69  ntly in use.** i
13c50 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
13c60 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
13c70 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20   nFin parameter 
13c80 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
13c90 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13ca0 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20  assumes.** that 
13cb0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
13cc0 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
13cd0 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
13ce0 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e  til.** it return
13cf0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
13d00 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
13d10 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a  hat nFin is the.
13d20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
13d30 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
13d40 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  file will contai
13d50 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a  n after this .**
13d60 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70   process is comp
13d70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lete..*/.static 
13d80 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
13d90 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
13da0 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
13db0 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67  o iLastPg){.  Pg
13dc0 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
13dd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13de0 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
13df0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
13e00 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
13e10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13e20 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
13e30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
13e40 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
13e50 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
13e60 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
13e70 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
13e80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
13e90 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  t) ){.    int rc
13ea0 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
13eb0 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
13ec0 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
13ed0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
13ee0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
13ef0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
13f00 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
13f10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13f20 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
13f30 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
13f40 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
13f50 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
13f60 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
13f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13f80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13f90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
13fa0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
13fb0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
13fc0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
13fd0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
13fe0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
13ff0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
14000 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e  {.      if( nFin
14010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
14020 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
14030 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
14040 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
14050 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
14060 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e  .        ** if n
14070 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  Fin is non-zero.
14080 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
14090 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
140a0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
140b0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
140c0 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
140d0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
140e0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
140f0 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
14100 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
14110 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
14120 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
14130 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
14140 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
14150 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
14160 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
14170 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
14180 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
14190 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
141a0 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20  astPg, 1);.     
141b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
141c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
141d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
141e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
141f0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
14200 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
14210 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
14220 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
14230 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
14240 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
14250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14260 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
14270 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
14280 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
14290 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
142a0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
142b0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
142c0 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
142d0 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
142e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
142f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14310 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
14320 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74   nFin is zero, t
14330 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
14340 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
14350 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
14360 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
14370 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
14380 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
14390 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
143a0 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
143b0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
143c0 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20  r hand, if nFin 
143d0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
143e0 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
143f0 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
14400 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
14410 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
14420 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
14430 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
14440 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
14450 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
14460 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
14470 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
14480 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
14490 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
144a0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
144b0 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30  , &iFreePg, 0, 0
144c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
144d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
144e0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
144f0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
14500 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14510 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
14520 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
14530 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
14540 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21     }while( nFin!
14550 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  =0 && iFreePg>nF
14560 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
14570 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
14580 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
14590 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
145a0 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74  PagerWrite(pLast
145b0 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
145c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
145d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
145e0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
145f0 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
14600 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
14610 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21  , iFreePg, nFin!
14620 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  =0);.      }.   
14630 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
14640 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
14650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14660 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
14670 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
14680 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
14690 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nFin==0 ){.    i
146a0 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68  LastPg--;.    wh
146b0 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
146c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
146d0 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50  pBt)||PTRMAP_ISP
146e0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
146f0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50  ) ){.      if( P
14700 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
14710 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
14720 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
14730 50 67 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  Pg;.        int 
14740 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
14750 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
14760 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b  astPg, &pPg, 0);
14770 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
14780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14790 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
147a0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
147b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
147c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
147d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
147e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
147f0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Pg);.        if(
14800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14810 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
14820 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
14830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14840 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a  LastPg--;.    }.
14850 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14860 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
14870 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74  t->pPager, iLast
14880 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
14890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
148a0 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
148b0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
148c0 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
148d0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
148e0 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
148f0 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
14900 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
14910 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
14920 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
14930 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
14940 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
14950 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
14960 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
14970 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
14980 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
14990 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
149a0 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
149b0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
149c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
149d0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
149e0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
149f0 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
14a00 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
14a10 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
14a20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
14a30 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14a40 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
14a50 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
14a60 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
14a70 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14a80 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
14a90 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
14aa0 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
14ab0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
14ac0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14ad0 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
14ae0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
14af0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
14b00 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e  Bt);.    rc = in
14b10 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
14b20 2c 20 30 2c 20 70 61 67 65 72 50 61 67 65 63 6f  , 0, pagerPageco
14b30 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a 20  unt(pBt));.  }. 
14b40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14b50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
14b60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
14b70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14b80 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
14b90 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
14ba0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
14bb0 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65  on.** is commite
14bc0 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
14bd0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
14be0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
14bf0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
14c00 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
14c10 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
14c20 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
14c30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14c40 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
14c50 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
14c60 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
14c70 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
14c80 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
14c90 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
14ca0 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
14cb0 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
14cc0 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
14cd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14ce0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
14cf0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14d00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14d10 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
14d20 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
14d30 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
14d40 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
14d50 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
14d60 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  t(pPager) );..  
14d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14d80 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14d90 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
14da0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
14db0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
14dc0 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
14dd0 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
14de0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
14df0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
14e00 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
14e10 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  .    Pgno nPtrma
14e20 70 3b 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  p;.    Pgno iFre
14e30 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e;.    const int
14e40 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67   pgsz = pBt->pag
14e50 65 53 69 7a 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eSize;.    Pgno 
14e60 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61 67  nOrig = pagerPag
14e70 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 0a 20 20  ecount(pBt);..  
14e80 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
14e90 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
14ea0 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  || nOrig==PENDIN
14eb0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
14ec0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
14ed0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
14ee0 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61  to create a data
14ef0 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74  base for which t
14f00 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20  he final page.  
14f10 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
14f20 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
14f30 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69  age or the pendi
14f40 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66  ng-byte page. If
14f50 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73   one.      ** is
14f60 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
14f70 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72  is indicates cor
14f80 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruption..      *
14f90 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
14fa0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
14fb0 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  PT;.    }..    n
14fc0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
14fd0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
14fe0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 50  ata[36]);.    nP
14ff0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
15000 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
15010 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70  NO(pBt, nOrig)+p
15020 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b  gsz/5)/(pgsz/5);
15030 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  .    nFin = nOri
15040 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
15050 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72  map;.    if( nOr
15060 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
15070 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
15080 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
15090 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
150a0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
150b0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
150c0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
150d0 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
150e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
150f0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
15100 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n--;.    }.    i
15110 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
15120 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
15130 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20  RRUPT_BKPT;..   
15140 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
15150 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
15160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
15170 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
15180 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
15190 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
151a0 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
151b0 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
151c0 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
151d0 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
151e0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
151f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
15200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15210 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
15220 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
15230 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
15240 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
15250 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
15260 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
15270 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
15280 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  ], 0);.      sql
15290 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
152a0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
152b0 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d  er, nFin);.    }
152c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
152d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
152e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
152f0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15300 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
15310 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33  t( nRef==sqlite3
15320 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
15330 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
15340 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
15350 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
15360 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
15370 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
15380 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
15390 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
153a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
153b0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
153c0 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
153d0 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
153e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
153f0 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
15400 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
15410 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
15420 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
15430 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
15440 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
15450 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
15460 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
15470 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
15480 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
15490 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
154a0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
154b0 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
154c0 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
154d0 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
154e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
154f0 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
15500 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
15510 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
15520 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
15530 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
15540 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
15550 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
15560 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
15570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15580 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
15590 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
155a0 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
155b0 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
155c0 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
155d0 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
155e0 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
155f0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
15600 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
15610 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
15620 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
15630 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
15640 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
15650 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
15660 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
15670 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
15680 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
15690 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
156a0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
156b0 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
156c0 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
156d0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
156e0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
156f0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
15700 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
15710 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
15720 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
15730 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
15740 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
15750 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
15760 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
15770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
15780 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
15790 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
157a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
157b0 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
157c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
157d0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
157e0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
157f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
15800 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
15810 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
15820 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
15830 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
15840 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
15850 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
15860 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
15870 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
15880 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
15890 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
158a0 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
158b0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
158c0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
158d0 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
158e0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
158f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15900 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
15910 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
15920 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
15930 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15940 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
15950 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
15960 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
15970 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15980 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
15990 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
159a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
159b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
159c0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
159d0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
159e0 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
159f0 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
15a00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15a10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
15a20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15a30 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
15a40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
15a50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15a60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15a70 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
15a80 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
15a90 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
15aa0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15ab0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
15ac0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
15ad0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
15ae0 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
15af0 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
15b00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15b10 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
15b20 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
15b30 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
15b40 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
15b50 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
15b60 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  ne() routine doe
15b70 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
15b80 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  e and should.** 
15b90 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72  be invoked prior
15ba0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
15bb0 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
15bc0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
15bd0 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72  tPhaseOne().** r
15be0 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74  outine did all t
15bf0 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69  he work of writi
15c00 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ng information o
15c10 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66  ut to disk and f
15c20 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lushing the.** c
15c30 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20  ontents so that 
15c40 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e  they are written
15c50 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70   onto the disk p
15c60 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69  latter.  All thi
15c70 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73  s.** routine has
15c80 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65   to do is delete
15c90 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20   or truncate or 
15ca0 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20  zero the header 
15cb0 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f  in the.** the ro
15cc0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28  llback journal (
15cd0 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65  which causes the
15ce0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
15cf0 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64  commit) and.** d
15d00 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  rop locks..**.**
15d10 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
15d20 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
15d30 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
15d40 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
15d50 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
15d60 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
15d70 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
15d80 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
15d90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
15da0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74  ommitPhaseTwo(Bt
15db0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
15dc0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15dd0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
15de0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
15df0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
15e00 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
15e10 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
15e20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
15e30 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
15e40 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
15e50 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
15e60 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
15e70 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
15e80 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
15e90 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
15ea0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
15eb0 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
15ec0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
15ed0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
15ee0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
15ef0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
15f00 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
15f10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
15f20 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
15f30 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
15f40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15f50 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
15f60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15f70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
15f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
15f90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
15fa0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
15fb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
15fc0 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e  ndle has any kin
15fd0 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
15fe0 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
15ff0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16000 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74  .  ** count of t
16010 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
16020 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
16030 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65  ion count reache
16040 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68  s 0, set.  ** th
16050 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
16060 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
16070 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
16080 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c  nused() call bel
16090 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c  ow.  ** will unl
160a0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20  ock the pager.. 
160b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
160c0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
160d0 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 41 6c 6c   ){.    clearAll
160e0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
160f0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 42  Locks(p);.    pB
16100 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
16110 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
16120 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
16130 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
16140 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
16150 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
16160 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
16170 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
16180 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
16190 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
161a0 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61  lock.  ** the pa
161b0 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
161c0 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
161d0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
161e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
161f0 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  .  btreeClearHas
16200 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
16210 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
16220 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63  NS_NONE;.  unloc
16230 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
16240 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  Bt);..  btreeInt
16250 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
16260 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16270 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16280 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16290 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
162a0 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
162b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
162c0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
162d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
162e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
162f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
16300 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
16310 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
16320 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16330 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16340 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
16350 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20  aseTwo(p);.  }. 
16360 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16370 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16380 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
16390 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
163a0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
163b0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f   write-cursors o
163c0 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64  pen on this hand
163d0 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  le. This is for 
163e0 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
163f0 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
16400 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
16410 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
16420 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
16430 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
16440 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
16450 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72  is routine, a wr
16460 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e  ite-cursor is an
16470 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
16480 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77   is capable of w
16490 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
164a0 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61  tabse.  That mea
164b0 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  ns the cursor wa
164c0 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20  s.** originally 
164d0 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
164e0 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ng and the curso
164f0 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73  r has not be dis
16500 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69  abled.** by havi
16510 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61  ng its state cha
16520 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46  nged to CURSOR_F
16530 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  AULT..*/.static 
16540 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75  int countWriteCu
16550 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
16560 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
16570 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
16580 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
16590 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
165a0 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
165b0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
165c0 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70  Cur->wrFlag && p
165d0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
165e0 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
165f0 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
16600 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16610 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
16620 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
16630 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
16640 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
16650 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
16660 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
16670 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74  on BtShared that
16680 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
16690 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  ences..**.** Eve
166a0 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69  ry cursor is tri
166b0 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
166c0 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c  cursors that bel
166d0 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20  ong.** to other 
166e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
166f0 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
16700 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a   to be sharing.*
16710 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  * the cache with
16720 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
16730 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
16740 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
16750 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a  ollback occurs..
16760 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75  ** All cursors u
16770 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61  sing the same ca
16780 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70  che must be trip
16790 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e  ped.** to preven
167a0 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69  t them from tryi
167b0 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74  ng to use the bt
167c0 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ree after.** the
167d0 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
167e0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
167f0 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73  e deleted tables
16800 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f  .** or moved roo
16810 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69  t pages, so it i
16820 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
16830 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20   to.** save the 
16840 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
16850 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72  sor.  The cursor
16860 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61   must be.** inva
16870 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  lidated..*/.void
16880 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
16890 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
168a0 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
168b0 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72  rrCode){.  BtCur
168c0 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  sor *p;.  sqlite
168d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
168e0 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ee);.  for(p=pBt
168f0 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
16900 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
16910 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
16920 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
16930 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
16940 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
16950 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
16960 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64  p->skip = errCod
16970 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
16980 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  i<=p->iPage; i++
16990 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
169a0 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69  Page(p->apPage[i
169b0 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50  ]);.      p->apP
169c0 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  age[i] = 0;.    
169d0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
169e0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
169f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
16a00 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
16a10 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
16a20 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  .  All cursors w
16a30 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ill be.** invali
16a40 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ded by this oper
16a50 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
16a60 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72  mpt to use a cur
16a70 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20  sor.** that was 
16a80 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
16a90 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
16aa0 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  eration will res
16ab0 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72  ult.** in an err
16ac0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
16ad0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
16ae0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
16af0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16b00 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
16b10 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
16b20 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
16b30 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
16b40 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
16b50 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
16b60 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16b70 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
16b80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16b90 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
16ba0 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  1;..  sqlite3Btr
16bb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
16bc0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
16bd0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69  s(pBt, 0, 0);.#i
16be0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16bf0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
16c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16c10 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  OK ){.    /* Thi
16c20 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20  s is a horrible 
16c30 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f  situation. An IO
16c40 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
16c50 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  or occurred whil
16c60 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67  st.    ** trying
16c70 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20   to save cursor 
16c80 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68  positions. If th
16c90 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74  is is an automat
16ca0 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a  ic rollback (as.
16cb0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c      ** the resul
16cc0 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e  t of a constrain
16cd0 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  t, malloc() fail
16ce0 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29  ure or IO error)
16cf0 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   then .    ** th
16d00 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69  e cache may be i
16d10 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73  nternally incons
16d20 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74  istent (not cont
16d30 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29  ain valid trees)
16d40 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61   so.    ** we ca
16d50 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75  nnot simply retu
16d60 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20  rn the error to 
16d70 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74  the caller. Inst
16d80 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20  ead, abort .    
16d90 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74  ** all queries t
16da0 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67  hat may be using
16db0 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73   any of the curs
16dc0 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20  ors that failed 
16dd0 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a  to save..    */.
16de0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16df0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
16e00 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  , rc);.  }.#endi
16e10 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  f.  btreeIntegri
16e20 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ty(p);..  if( p-
16e30 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
16e40 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
16e50 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
16e60 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
16e70 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
16e80 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
16e90 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
16ea0 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
16eb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
16ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16ed0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
16ee0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
16ef0 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
16f00 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
16f10 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
16f20 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
16f30 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65  all sqlite3Btree
16f40 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
16f50 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
16f60 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
16f70 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
16f80 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
16f90 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16fa0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
16fb0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
16fc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16fd0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
16fe0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
16ff0 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
17000 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
17010 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
17020 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
17030 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
17040 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  }..  if( p->inTr
17050 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
17060 29 7b 0a 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  ){.    clearAllS
17070 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
17080 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 61 73 73  ocks(p);.    ass
17090 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
170a0 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
170b0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
170c0 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
170d0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
170e0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
170f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
17100 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
17110 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 43 6c  }.  }..  btreeCl
17120 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
17130 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73  t);.  p->inTrans
17140 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
17150 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
17160 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74  used(pBt);..  bt
17170 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
17180 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17190 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
171a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
171b0 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
171c0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
171d0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
171e0 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72  ion can can be r
171f0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
17200 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
17210 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
17220 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
17230 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
17240 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
17250 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
17260 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
17270 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
17280 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
17290 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
172a0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
172b0 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
172c0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
172d0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
172e0 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
172f0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
17300 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
17310 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
17320 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
17330 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
17340 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
17350 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
17360 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
17370 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
17380 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
17390 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
173a0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
173b0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
173c0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
173d0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
173e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
173f0 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
17400 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
17410 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
17420 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
17430 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
17440 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
17450 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
17460 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
17470 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
17480 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
17490 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
174a0 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
174b0 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
174c0 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
174d0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
174e0 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
174f0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
17500 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
17510 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
17520 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
17530 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
17540 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
17550 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
17560 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
17570 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
17580 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
17590 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
175a0 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
175b0 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
175c0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
175d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
175e0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
175f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17600 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
17610 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
17620 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
17630 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  pBt->readOnly==0
17640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
17650 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
17660 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
17670 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
17680 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45  oint );.  if( NE
17690 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  VER(p->inTrans!=
176a0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70  TRANS_WRITE || p
176b0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  Bt->readOnly) ){
176c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
176d0 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c  _INTERNAL;.  }el
176e0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
176f0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
17700 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
17710 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65  );.    /* At the
17720 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
17730 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
17740 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
17750 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a  oint with.    **
17760 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
17770 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
17780 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
17790 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
177a0 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d     ** SQL statem
177b0 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
177c0 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
177d0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
177e0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
177f0 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
17800 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
17810 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
17820 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
17830 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
17840 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
17850 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
17860 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
17870 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
17880 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17890 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
178a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
178b0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
178c0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c  is function, op,
178d0 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50   is always SAVEP
178e0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a  OINT_ROLLBACK.**
178f0 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
17900 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63  LEASE. This func
17910 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65  tion either rele
17920 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  ases or rolls ba
17930 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f  ck the.** savepo
17940 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  int identified b
17950 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76  y parameter iSav
17960 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e  epoint, dependin
17970 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a  g on the value .
17980 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ** of op..**.** 
17990 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70  Normally, iSavep
179a0 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
179b0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
179c0 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20   zero. However, 
179d0 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45  if op is.** SAVE
179e0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
179f0 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  then iSavepoint 
17a00 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20  may also be -1. 
17a10 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
17a20 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
17a30 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
17a40 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c  saction are roll
17a50 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
17a60 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
17a70 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e  om a normal tran
17a80 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
17a90 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  , as no locks ar
17aa0 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74  e released and t
17ab0 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
17ac0 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a  n remains open..
17ad0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17ae0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72  reeSavepoint(Btr
17af0 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  ee *p, int op, i
17b00 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
17b10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17b20 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26  E_OK;.  if( p &&
17b30 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
17b40 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
17b50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17b60 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
17b70 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
17b80 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
17b90 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
17ba0 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
17bb0 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
17bc0 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
17bd0 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
17be0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
17bf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
17c00 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
17c10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17c20 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
17c30 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
17c40 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
17c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17c60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  {.      rc = new
17c70 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
17c80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17c90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17ca0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
17cc0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
17cd0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
17ce0 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
17cf0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
17d00 20 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75   The act of acqu
17d10 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67  iring a cursor g
17d20 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ets a read lock 
17d30 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  on .** the datab
17d40 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
17d50 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
17d60 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
17d70 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
17d80 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
17d90 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
17da0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
17db0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
17dc0 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
17dd0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
17de0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
17df0 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
17e00 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
17e10 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
17e20 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
17e30 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
17e40 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
17e50 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
17e60 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
17e70 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
17e80 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
17e90 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
17ea0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
17eb0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
17ec0 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
17ed0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
17ee0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
17ef0 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
17f00 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
17f10 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
17f20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
17f30 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
17f40 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
17f50 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
17f60 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
17f70 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
17f80 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
17f90 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
17fa0 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
17fb0 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
17fc0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
17fd0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
17fe0 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
17ff0 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
18000 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
18010 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
18020 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
18030 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
18040 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
18050 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
18060 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
18070 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
18080 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
18090 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
180a0 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
180b0 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
180c0 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
180d0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
180e0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
180f0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
18100 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
18110 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
18120 28 29 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  () bytes of memo
18130 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  ry .** pointed t
18140 6f 20 62 79 20 70 43 75 72 20 68 61 76 65 20 62  o by pCur have b
18150 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 74 68  een zeroed by th
18160 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
18170 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
18180 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
181b0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
181c0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
181f0 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
18200 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
18210 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
18240 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
18250 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
18260 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
18270 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
18280 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
18290 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
182a0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182c0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
182d0 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
182e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
182f0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20    Pgno nPage;.  
18300 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18310 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
18320 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
18330 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
18340 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
18350 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
18360 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   );.  if( wrFlag
18370 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18380 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
18390 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
183a0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  pBt->readOnly) )
183b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
183c0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
183d0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
183e0 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c  heckForReadConfl
183f0 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 2c 20  icts(p, iTable, 
18400 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
18410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
18430 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  ==SQLITE_LOCKED_
18440 53 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20  SHAREDCACHE );. 
18450 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18460 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
18470 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
18480 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  ){.    rc = lock
18490 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
184a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
184b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
184c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
184d0 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
184e0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
184f0 69 54 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73  iTable;.  rc = s
18500 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
18510 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
18520 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 29  , (int *)&nPage)
18530 3b 20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ; .  if( rc!=SQL
18540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
18550 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
18560 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
18570 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
18580 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54  rc = SQLITE_EMPT
18590 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  Y;.    goto crea
185a0 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
185b0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ion;.  }.  rc = 
185c0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
185d0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
185e0 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
185f0 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20 72 63 21  e[0]);.  if( rc!
18600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18610 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
18620 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
18630 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
18640 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
18650 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
18660 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
18670 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
18680 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e  * variables, lin
18690 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
186a0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
186b0 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43  ist and set *ppC
186c0 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74  ur (the.  ** out
186d0 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  put argument to 
186e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a  this function)..
186f0 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65    */.  pCur->pKe
18700 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
18710 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
18720 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
18730 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d  t = pBt;.  pCur-
18740 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72  >wrFlag = (u8)wr
18750 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e  Flag;.  pCur->pN
18760 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
18770 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  or;.  if( pCur->
18780 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
18790 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
187a0 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42  = pCur;.  }.  pB
187b0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
187c0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
187d0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
187e0 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68  ID;.  pCur->cach
187f0 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20  edRowid = 0;..  
18800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18810 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72  ;..create_cursor
18820 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65  _exception:.  re
18830 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
18840 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 75 6e  apPage[0]);.  un
18850 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
18860 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  d(pBt);.  return
18870 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
18880 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
18890 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
188c0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
188d0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
18900 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
18910 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
18920 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
18950 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
18960 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
18970 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
18980 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
18990 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
189a0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
189b0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
189c0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189e0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
189f0 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
18a00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
18a10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18a20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
18a30 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
18a40 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
18a50 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
18a60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18a70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18a80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18a90 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
18aa0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
18ab0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
18ac0 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
18ad0 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
18ae0 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
18af0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
18b00 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
18b10 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
18b20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
18b30 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
18b40 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
18b50 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
18b60 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
18b70 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
18b80 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
18b90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
18ba0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18bb0 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
18bc0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a  d){.  return siz
18bd0 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d  eof(BtCursor);.}
18be0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
18bf0 63 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c  cached rowid val
18c00 75 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73  ue of every curs
18c10 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  or in the same d
18c20 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
18c30 61 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69  as pCur and havi
18c40 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ng the same root
18c50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20   page number as 
18c60 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65  pCur.  The value
18c70 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52   is.** set to iR
18c80 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  owid..**.** Only
18c90 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20   positive rowid 
18ca0 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
18cb0 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20  dered valid for 
18cc0 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54  this cache..** T
18cd0 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74  he cache is init
18ce0 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c  ialized to zero,
18cf0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
18d00 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a  nvalid cache..**
18d10 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f   A btree will wo
18d20 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72  rk fine with zer
18d30 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
18d40 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63  wids.  We just c
18d50 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a  annot.** cache z
18d60 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20  ero or negative 
18d70 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65  rowids, which me
18d80 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20  ans tables that 
18d90 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e  use zero or.** n
18da0 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d  egative rowids m
18db0 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
18dc0 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69  e slower.  But i
18dd0 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f  n practice, zero
18de0 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20  .** or negative 
18df0 72 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20  rowids are very 
18e00 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73  uncommon so this
18e10 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
18e20 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
18e30 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  d sqlite3BtreeSe
18e40 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
18e50 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c  ursor *pCur, sql
18e60 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
18e70 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  d){.  BtCursor *
18e80 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d  p;.  for(p=pCur-
18e90 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
18ea0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
18eb0 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
18ec0 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ot==pCur->pgnoRo
18ed0 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f  ot ) p->cachedRo
18ee0 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
18ef0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
18f00 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69  ->cachedRowid==i
18f10 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rowid );.}../*.*
18f20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63  * Return the cac
18f30 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68  hed rowid for th
18f40 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20  e given cursor. 
18f50 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a   A negative or z
18f60 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  ero.** return va
18f70 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  lue indicates th
18f80 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63  at the rowid cac
18f90 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e  he is invalid an
18fa0 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  d should be.** i
18fb0 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20  gnored.  If the 
18fc0 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20  rowid cache has 
18fd0 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
18fe0 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a  n set, then a.**
18ff0 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
19000 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  d..*/.sqlite3_in
19010 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  t64 sqlite3Btree
19020 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42  GetCachedRowid(B
19030 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19040 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63    return pCur->c
19050 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  achedRowid;.}../
19060 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
19070 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
19080 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
19090 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
190a0 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
190b0 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
190c0 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
190d0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
190e0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
190f0 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
19100 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
19110 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
19120 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
19130 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
19140 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
19150 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
19160 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
19170 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
19180 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
19190 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r);.    if( pCur
191a0 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
191b0 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pCur->pPrev->pN
191c0 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
191d0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
191e0 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
191f0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
19200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
19210 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
19220 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
19230 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50  pPrev = pCur->pP
19240 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  rev;.    }.    f
19250 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
19260 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
19270 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19280 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
19290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
192a0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
192b0 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69  pBt);.    invali
192c0 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
192d0 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20  e(pCur);.    /* 
192e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
192f0 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
19300 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
19310 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
19320 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19330 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65  ./*.** Make a te
19340 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62  mporary cursor b
19350 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  y filling in the
19360 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70   fields of pTemp
19370 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70  Cur..** The temp
19380 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20  orary cursor is 
19390 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f  not on the curso
193a0 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42  r list for the B
193b0 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
193c0 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d  lite3BtreeGetTem
193d0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
193e0 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72   *pCur, BtCursor
193f0 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 69   *pTempCur){.  i
19400 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
19410 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19420 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63  (pCur) );.  memc
19430 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75  py(pTempCur, pCu
19440 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73  r, sizeof(BtCurs
19450 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72  or));.  pTempCur
19460 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
19470 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d  TempCur->pPrev =
19480 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
19490 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50 61 67  <=pTempCur->iPag
194a0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  e; i++){.    sql
194b0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65  ite3PagerRef(pTe
194c0 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  mpCur->apPage[i]
194d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
194e0 20 20 61 73 73 65 72 74 28 20 70 54 65 6d 70 43    assert( pTempC
194f0 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a 7d  ur->pKey==0 );.}
19500 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
19510 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
19520 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d 61  r such as was ma
19530 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74 65  de by the Create
19540 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28  TemporaryCursor(
19550 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62  ).** function ab
19560 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ove..*/.void sql
19570 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65  ite3BtreeRelease
19580 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
19590 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
195a0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63  t i;.  assert( c
195b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
195c0 70 43 75 72 29 20 29 3b 0a 20 20 66 6f 72 28 69  pCur) );.  for(i
195d0 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
195e0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ge; i++){.    sq
195f0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
19600 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
19610 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  >pDbPage);.  }. 
19620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
19630 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 0a 0a 0a  ur->pKey);.}....
19640 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
19650 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
19660 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
19670 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
19680 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
19690 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
196a0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
196b0 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
196c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
196d0 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
196e0 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
196f0 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
19700 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
19710 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
19720 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
19730 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
19740 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
19750 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
19760 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  o sqlite3BtreePa
19770 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
19780 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
19790 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
197a0 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
197b0 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
197c0 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
197d0 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
197e0 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
197f0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
19800 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
19810 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
19820 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
19830 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
19840 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
19850 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
19860 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
19870 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
19880 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
19890 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
198a0 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
198b0 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
198c0 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
198d0 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
198e0 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
198f0 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
19900 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
19910 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
19920 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
19930 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
19940 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
19950 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
19960 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
19970 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
19980 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
19990 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
199a0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
199b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
199c0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
199d0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43  pPage[iPage], pC
199e0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
199f0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
19a00 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e  sert( memcmp(&in
19a10 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
19a20 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
19a30 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
19a40 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
19a50 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
19a60 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45  f.#ifdef _MSC_VE
19a70 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61  R.  /* Use a rea
19a80 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53  l function in MS
19a90 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  VC to work aroun
19aa0 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63  d bugs in that c
19ab0 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74  ompiler. */.  st
19ac0 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c  atic void getCel
19ad0 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
19ae0 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70  pCur){.    if( p
19af0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
19b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
19b10 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
19b20 61 67 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  age;.      sqlit
19b30 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
19b40 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
19b50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
19b60 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
19b70 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
19b80 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
19b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19ba0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
19bb0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
19bc0 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
19bd0 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
19be0 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
19bf0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
19c00 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
19c10 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
19c20 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
19c30 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
19c40 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c70 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
19c80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
19c90 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 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 5c 0a 20 20 20 20 69           \.    i
19cd0 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
19ce0 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >iPage;         
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
19d20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
19d30 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
19d40 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
19d50 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
19d60 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20  ur->info); \.   
19d70 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
19d80 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
19dc0 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
19e10 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
19e20 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20  o(pCur);        
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
19e60 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d    }.#endif /* _M
19e70 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SC_VER */../*.**
19e80 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
19e90 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
19ea0 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
19eb0 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
19ec0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
19ed0 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
19ee0 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
19ef0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
19f00 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
19f10 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
19f20 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
19f30 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
19f40 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
19f50 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
19f60 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
19f70 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
19f80 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
19f90 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
19fa0 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
19fb0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
19fc0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19fd0 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
19fe0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
19ff0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1a000 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1a010 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1a020 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1a030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a040 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1a050 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1a060 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1a070 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
1a080 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1a090 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
1a0a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1a0b0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a  VALID ){.      *
1a0c0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pSize = 0;.    }
1a0d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43  else{.      getC
1a0e0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1a0f0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43       *pSize = pC
1a100 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1a110 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1a130 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
1a140 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1a150 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20   of data in the 
1a160 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72  entry the.** cur
1a170 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
1a180 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73  ints to.  Always
1a190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a1a0 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  K..** Failure is
1a1b0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
1a1c0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1a1d0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a   not currently.*
1a1e0 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  * pointing to an
1a1f0 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63 61   entry (which ca
1a200 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
1a210 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65  ample, if.** the
1a220 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
1a230 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20  ty) then *pSize 
1a240 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a  is set to 0..*/.
1a250 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a260 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
1a270 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
1a280 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1a290 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1a2a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1a2b0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1a2c0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
1a2d0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1a2e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a2f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1a300 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a310 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
1a320 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a330 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
1a340 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a350 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1a360 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  {.      /* Not p
1a370 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
1a380 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a  id entry - set *
1a390 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20  pSize to 0. */. 
1a3a0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
1a3b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a3c0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1a3d0 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
1a3e0 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1a3f0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
1a400 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a410 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1a420 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
1a430 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1a440 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1a450 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
1a460 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
1a470 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
1a480 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1a490 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1a4a0 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
1a4b0 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
1a4c0 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
1a4d0 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
1a4e0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
1a4f0 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
1a500 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
1a510 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1a520 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
1a530 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
1a540 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
1a550 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1a560 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1a570 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
1a580 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1a590 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
1a5a0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1a5b0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
1a5c0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
1a5d0 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
1a5e0 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
1a5f0 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
1a600 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
1a610 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
1a620 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
1a630 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
1a640 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
1a650 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1a660 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
1a670 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1a680 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1a690 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
1a6a0 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
1a6b0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1a6c0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
1a6d0 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
1a6e0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1a6f0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1a700 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
1a710 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
1a720 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
1a730 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
1a740 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
1a750 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
1a760 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
1a770 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
1a780 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
1a790 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
1a7a0 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
1a7b0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
1a7c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1a7d0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
1a7e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1a7f0 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
1a820 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
1a830 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
1a840 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
1a850 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
1a860 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
1a870 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
1a880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1a890 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
1a8a0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
1a8b0 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
1a8c0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1a8d0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
1a8e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1a8f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a900 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1a910 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1a920 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
1a930 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a940 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1a950 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
1a960 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
1a970 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1a980 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
1a990 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
1a9a0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
1a9b0 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
1a9c0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
1a9d0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
1a9e0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
1a9f0 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
1aa00 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
1aa10 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
1aa20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
1aa30 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
1aa40 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
1aa50 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
1aa60 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
1aa70 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
1aa80 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
1aa90 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1aaa0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1aab0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
1aac0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
1aad0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
1aae0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1aaf0 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
1ab00 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
1ab10 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ab20 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
1ab30 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
1ab40 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67   if( iGuess<=pag
1ab50 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
1ab60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1ab70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
1ab80 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
1ab90 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1aba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1abb0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1abc0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
1abd0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
1abe0 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
1abf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ac00 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1ac10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1ac20 64 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  dif..  if( rc==S
1ac30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ac40 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ac50 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
1ac60 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  fl, &pPage, 0);.
1ac70 20 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53      assert(rc==S
1ac80 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1ac90 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  e==0);.    if( n
1aca0 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  ext==0 && rc==SQ
1acb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1acc0 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
1acd0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1ace0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
1acf0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
1ad00 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
1ad10 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
1ad20 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1ad30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1ad40 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1ad50 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
1ad60 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
1ad70 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1ad80 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
1ad90 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
1ada0 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
1adb0 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
1adc0 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
1add0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1ade0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
1adf0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1ae00 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
1ae10 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
1ae20 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
1ae30 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
1ae40 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
1ae50 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
1ae60 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
1ae70 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
1ae80 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
1ae90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1aea0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1aeb0 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
1aec0 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
1aed0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
1aee0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1aef0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
1af00 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1af10 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1af20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
1af30 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
1af40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1af50 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
1af60 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
1af70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1af80 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
1af90 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
1afa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1afb0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
1afc0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
1afd0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
1afe0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1aff0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
1b000 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b020 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
1b030 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
1b040 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
1b050 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
1b060 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
1b070 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
1b080 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
1b090 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
1b0a0 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
1b0b0 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
1b0c0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
1b0d0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
1b0e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1b0f0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1b100 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b110 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b120 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
1b130 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1b140 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
1b150 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
1b160 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
1b170 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
1b180 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
1b190 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
1b1a0 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
1b1b0 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
1b1c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b1d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1b1e0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
1b1f0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
1b200 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1b210 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
1b220 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
1b230 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
1b240 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
1b250 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
1b260 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
1b270 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
1b280 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
1b290 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
1b2a0 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
1b2b0 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
1b2c0 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
1b2d0 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
1b2e0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
1b2f0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
1b300 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
1b310 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
1b320 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
1b330 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
1b340 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1b350 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
1b360 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
1b370 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e  ot make a distin
1b380 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65  ction between ke
1b390 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49  y and data..** I
1b3a0 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20  t just reads or 
1b3b0 77 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f  writes bytes fro
1b3c0 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72  m the payload ar
1b3d0 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20  ea.  Data might 
1b3e0 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68  .** appear on th
1b3f0 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62  e main page or b
1b400 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
1b410 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
1b420 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a  flow .** pages..
1b430 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
1b440 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
1b450 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1b460 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
1b470 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
1b480 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
1b490 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
1b4a0 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
1b4b0 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
1b4c0 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
1b4d0 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
1b4e0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1b4f0 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
1b500 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
1b510 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
1b520 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
1b530 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
1b540 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
1b550 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
1b560 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
1b570 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
1b580 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1b590 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1b5a0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1b5b0 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
1b5c0 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
1b5d0 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
1b5e0 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
1b5f0 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
1b600 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
1b610 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
1b620 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
1b630 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
1b640 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
1b650 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
1b660 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
1b670 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
1b680 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1b690 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
1b6a0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1b6b0 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
1b6c0 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
1b6d0 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
1b6e0 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
1b6f0 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
1b700 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
1b710 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
1b720 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
1b730 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
1b740 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1b750 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1b760 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1b770 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1b780 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
1b790 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
1b7a0 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
1b7b0 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
1b7c0 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
1b7d0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
1b7e0 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
1b7f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1b800 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
1b810 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
1b820 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
1b830 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20   int skipKey,   
1b840 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
1b850 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69  begins at data i
1b860 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
1b870 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20  /.  int eOp     
1b880 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
1b890 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
1b8a0 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
1b8b0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
1b8c0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
1b8d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b8e0 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  OK;.  u32 nKey;.
1b8f0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
1b900 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b910 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1b920 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
1b930 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
1b940 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
1b950 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b960 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b980 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
1b990 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
1b9a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1b9b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1b9c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b9d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1b9e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1b9f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1ba00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1ba10 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ba20 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ba30 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
1ba40 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1ba50 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1ba60 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
1ba70 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
1ba80 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69  nKey = (pPage->i
1ba90 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74  ntKey ? 0 : (int
1baa0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
1bab0 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65  );..  if( skipKe
1bac0 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  y ){.    offset 
1bad0 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  += nKey;.  }.  i
1bae0 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20  f( offset+amt > 
1baf0 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e  nKey+pCur->info.
1bb00 6e 44 61 74 61 20 0a 20 20 20 7c 7c 20 26 61 50  nData .   || &aP
1bb10 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1bb20 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
1bb30 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
1bb40 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a  sableSize].  ){.
1bb50 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
1bb60 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
1bb70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1bb80 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
1bb90 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
1bba0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1bbb0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1bbc0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
1bbd0 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
1bbe0 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
1bbf0 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
1bc00 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
1bc10 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
1bc20 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
1bc30 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
1bc40 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
1bc50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1bc60 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
1bc70 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
1bc80 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
1bc90 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
1bca0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
1bcb0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1bcc0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
1bcd0 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
1bce0 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
1bcf0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
1bd00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
1bd10 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
1bd20 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
1bd30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bd40 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1bd50 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
1bd60 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
1bd70 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
1bd80 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
1bd90 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
1bda0 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
1bdb0 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
1bdc0 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
1bdd0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1bde0 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
1bdf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1be00 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
1be10 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
1be20 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1be30 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
1be40 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
1be50 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
1be60 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
1be70 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
1be80 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
1be90 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
1bea0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
1beb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1bec0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1bed0 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
1bee0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1bef0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1bf00 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
1bf10 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
1bf20 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
1bf30 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
1bf40 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
1bf50 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
1bf60 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
1bf70 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
1bf80 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
1bf90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bfa0 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
1bfb0 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
1bfc0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1bfd0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
1bfe0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
1bff0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
1c000 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
1c010 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
1c020 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1c030 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
1c040 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1c050 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
1c060 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  fl);.      if( n
1c070 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61  Ovfl && !pCur->a
1c080 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1c090 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c0a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1c0b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c0c0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1c0d0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1c0e0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1c0f0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
1c100 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
1c110 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
1c120 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
1c130 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
1c140 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
1c150 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1c160 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
1c170 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
1c180 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
1c190 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  e] ){.      iIdx
1c1a0 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
1c1b0 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
1c1c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1c1d0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
1c1e0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
1c1f0 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
1c200 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1c210 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c    for( ; rc==SQL
1c220 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
1c230 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64  && nextPage; iId
1c240 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53  x++){..#ifndef S
1c250 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1c260 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  LOB.      /* If 
1c270 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
1c280 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
1c290 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1c2a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
1c2b0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
1c2c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c2d0 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1c2e0 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
1c2f0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
1c300 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
1c310 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1c320 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
1c330 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Page;.      }.#e
1c340 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
1c350 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
1c360 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1c370 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
1c380 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
1c390 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
1c3a0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1c3b0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
1c3c0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1c3d0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1c3e0 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
1c3f0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
1c400 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
1c410 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
1c420 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
1c430 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
1c440 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
1c450 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
1c460 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
1c470 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
1c480 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
1c490 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e  .        */.#ifn
1c4a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c4b0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20  INCRBLOB.       
1c4c0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1c4d0 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
1c4e0 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
1c4f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
1c500 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
1c510 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
1c520 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
1c530 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1c540 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
1c550 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
1c560 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
1c570 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  ge);.        off
1c580 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
1c590 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c5a0 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
1c5b0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1c5c0 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
1c5d0 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
1c5e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
1c5f0 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
1c600 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
1c610 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
1c620 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
1c630 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44      */.        D
1c640 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
1c650 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
1c660 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  amt;.        rc 
1c670 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1c680 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
1c690 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
1c6a0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1c6b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c6c0 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c  .          aPayl
1c6d0 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
1c6e0 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
1c6f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  e);.          ne
1c700 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
1c710 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
1c720 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
1c730 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
1c740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c750 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
1c760 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
1c770 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
1c780 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
1c790 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
1c7a0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1c7b0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
1c7c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1c7d0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
1c7e0 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65  .          offse
1c7f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1c800 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
1c810 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
1c820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c830 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1c840 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c850 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
1c860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1c870 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1c880 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c890 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
1c8a0 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
1c8b0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
1c8c0 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
1c8d0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
1c8e0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
1c8f0 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
1c900 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
1c910 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
1c920 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
1c930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1c940 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
1c950 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
1c960 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1c970 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
1c980 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
1c990 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
1c9a0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
1c9b0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
1c9c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c9d0 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
1c9e0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
1c9f0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
1ca00 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
1ca10 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1ca20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1ca30 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1ca40 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
1ca50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1ca60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ca70 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1ca80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1ca90 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1caa0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1cab0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
1cac0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1cad0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 69  >iPage] );.    i
1cae0 66 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  f( pCur->apPage[
1caf0 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
1cb00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cb10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1cb20 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1cb30 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1cb40 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
1cb50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1cb60 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
1cb70 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
1cb80 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
1cb90 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
1cba0 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
1cbb0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1cbc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cbd0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1cbe0 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
1cbf0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
1cc00 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
1cc10 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
1cc20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
1cc30 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
1cc40 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
1cc50 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
1cc60 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1cc70 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1cc80 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
1cc90 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
1cca0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
1ccb0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1ccc0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
1ccd0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
1cce0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
1ccf0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
1cd00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1cd10 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
1cd20 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
1cd30 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
1cd40 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
1cd50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1cd60 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1cd70 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
1cd80 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1cd90 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
1cda0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
1cdb0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1cdc0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1cdd0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1cde0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1cdf0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1ce00 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1ce10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1ce20 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1ce30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ce40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ce50 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1ce60 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1ce70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1ce80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ce90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1cea0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1ceb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1cec0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1ced0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1cee0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1cef0 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20  , pBuf, 1, 0);. 
1cf00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cf10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1cf20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
1cf30 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
1cf40 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
1cf50 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
1cf60 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
1cf70 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
1cf80 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
1cf90 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
1cfa0 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b  the key if skipK
1cfb0 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69  ey==0 and it poi
1cfc0 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e  nts to the begin
1cfd0 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a  ning of data if.
1cfe0 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20  ** skipKey==1.  
1cff0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
1d000 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
1d010 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
1d020 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41  tten.** into *pA
1d030 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
1d040 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1d050 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
1d060 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64  ot be.** a valid
1d070 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
1d080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1d090 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
1d0a0 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
1d0b0 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
1d0c0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
1d0d0 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
1d0e0 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
1d0f0 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
1d100 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
1d110 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
1d120 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
1d130 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
1d140 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
1d150 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
1d160 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
1d170 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
1d180 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
1d190 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
1d1a0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
1d1b0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
1d1c0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
1d1d0 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
1d1e0 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
1d1f0 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
1d200 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
1d210 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1d220 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
1d230 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
1d240 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
1d250 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
1d260 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1d270 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
1d280 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
1d290 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
1d2a0 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
1d2b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
1d2c0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1d2d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
1d2e0 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
1d2f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1d300 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1d310 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
1d320 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1d330 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20    int *pAmt,    
1d340 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1d350 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
1d360 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
1d370 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  re */.  int skip
1d380 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
1d390 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61  read beginning a
1d3a0 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
1d3b0 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
1d3c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
1d3d0 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67  ayload;.  MemPag
1d3e0 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20  e *pPage;.  u32 
1d3f0 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63  nKey;.  u32 nLoc
1d400 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  al;..  assert( p
1d410 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
1d420 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
1d430 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1d440 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
1d450 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1d460 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1d470 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1d480 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1d490 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
1d4a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1d4b0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
1d4c0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1d4d0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
1d4e0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65  e->nCell );.  ge
1d4f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1d500 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
1d510 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
1d520 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
1d530 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1d540 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
1d550 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
1d560 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
1d570 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29      nKey = (int)
1d580 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1d590 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
1d5a0 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
1d5b0 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
1d5c0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
1d5d0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
1d5e0 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
1d5f0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
1d600 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
1d610 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20  if( nLocal>nKey 
1d620 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20  ){.      nLocal 
1d630 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = nKey;.    }.  
1d640 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
1d650 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
1d660 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
1d670 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
1d680 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
1d690 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
1d6a0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
1d6b0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
1d6c0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
1d6d0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
1d6e0 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
1d6f0 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
1d700 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1d710 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
1d720 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
1d730 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
1d740 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
1d750 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
1d760 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
1d770 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
1d780 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
1d790 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
1d7a0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
1d7b0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
1d7c0 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
1d7d0 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
1d7e0 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
1d7f0 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
1d800 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
1d810 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
1d820 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1d830 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
1d840 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
1d850 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
1d860 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
1d870 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
1d880 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
1d890 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1d8a0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
1d8b0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1d8c0 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
1d8d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1d8e0 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73  nt *pAmt){.  ass
1d8f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d900 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1d910 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1d920 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1d930 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d940 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
1d950 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d960 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1d970 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
1d980 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
1d990 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
1d9a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1d9b0 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
1d9c0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
1d9d0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
1d9e0 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
1d9f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1da00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1da10 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1da20 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1da30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1da40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1da50 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1da60 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1da70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
1da80 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
1da90 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
1daa0 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 1);.  }.  ret
1dab0 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
1dac0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1dad0 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
1dae0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
1daf0 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
1db00 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
1db10 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
1db20 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
1db30 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   to..*/.static i
1db40 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
1db50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1db60 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  32 newPgno){.  i
1db70 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d  nt rc;.  int i =
1db80 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1db90 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
1dba0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
1dbb0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
1dbc0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1dbd0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1dbe0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1dbf0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1dc00 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1dc10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
1dc20 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
1dc30 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70  DEPTH );.  if( p
1dc40 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
1dc50 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
1dc60 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
1dc70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1dc80 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
1dc90 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
1dca0 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
1dcb0 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20  NewPage);.  if( 
1dcc0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1dcd0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
1dce0 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  +1] = pNewPage;.
1dcf0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b    pCur->aiIdx[i+
1dd00 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  1] = 0;.  pCur->
1dd10 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72  iPage++;..  pCur
1dd20 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1dd30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1dd40 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Key = 0;.  if( p
1dd50 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
1dd60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1dd70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1dd80 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
1dd90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1dda0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
1ddb0 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
1ddc0 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
1ddd0 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
1dde0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
1ddf0 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
1de00 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
1de10 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
1de20 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
1de30 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
1de40 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
1de50 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
1de60 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
1de70 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
1de80 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
1de90 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
1dea0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
1deb0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
1dec0 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
1ded0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
1dee0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
1def0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
1df00 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
1df10 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72  iChild){.  asser
1df20 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
1df30 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
1df40 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
1df50 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
1df60 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
1df70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
1df80 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
1df90 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
1dfa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1dfb0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
1dfc0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
1dfd0 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
1dfe0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
1dff0 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
1e000 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
1e010 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
1e020 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1e030 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
1e040 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
1e050 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1e060 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
1e070 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1e080 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
1e090 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
1e0a0 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
1e0b0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
1e0c0 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
1e0d0 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
1e0e0 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
1e0f0 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
1e100 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
1e110 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
1e120 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1e130 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1e140 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
1e150 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
1e160 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1e170 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1e180 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1e190 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1e1a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1e1b0 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
1e1c0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1e1d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1e1e0 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
1e1f0 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
1e200 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1e210 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
1e220 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1e230 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
1e240 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e250 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
1e260 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   );.  releasePag
1e270 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
1e280 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
1e290 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
1e2a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1e2b0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1e2c0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a  alidNKey = 0;.}.
1e2d0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1e2e0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f  cursor to the ro
1e2f0 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69  ot page.*/.stati
1e300 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
1e310 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e320 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
1e330 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
1e340 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65  QLITE_OK;.  Btre
1e350 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
1e360 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
1e370 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
1e380 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1e390 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1e3a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1e3b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
1e3c0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1e3d0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
1e3e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
1e3f0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1e400 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
1e410 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
1e420 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1e430 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
1e440 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
1e450 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
1e460 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
1e470 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
1e480 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ULT ){.      ret
1e490 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
1e4a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1e4b0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
1e4c0 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
1e4d0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
1e4e0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
1e4f0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1e500 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
1e510 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1e520 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
1e530 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
1e540 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a  }else{.    if( .
1e550 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21        SQLITE_OK!
1e560 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69  =(rc = getAndIni
1e570 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
1e580 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
1e590 2d 3e 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20  ->apPage[0])).  
1e5a0 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d    ){.      pCur-
1e5b0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1e5c0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
1e5d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1e5e0 0a 20 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20  .  }..  pRoot = 
1e5f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
1e600 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
1e610 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
1e620 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72  noRoot );.  pCur
1e630 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  ->iPage = 0;.  p
1e640 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
1e650 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
1e660 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
1e670 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
1e680 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1e690 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f   = 0;..  if( pRo
1e6a0 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ot->nCell==0 && 
1e6b0 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
1e6c0 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
1e6d0 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
1e6e0 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
1e6f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e700 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
1e710 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
1e720 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65  1 );.    subpage
1e730 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
1e740 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
1e750 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1e760 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62 70      assert( subp
1e770 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75  age>0 );.    pCu
1e780 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1e790 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
1e7a0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1e7b0 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
1e7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
1e7d0 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f  ->eState = ((pRo
1e7e0 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52  ot->nCell>0)?CUR
1e7f0 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52  SOR_VALID:CURSOR
1e800 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20  _INVALID);.  }. 
1e810 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e820 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1e830 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
1e840 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
1e850 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1e860 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
1e870 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
1e880 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
1e890 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
1e8a0 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
1e8b0 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
1e8c0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
1e8d0 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
1e8e0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1e8f0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
1e900 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
1e910 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1e920 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1e930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1e940 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1e950 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e960 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1e980 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1e990 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1e9a0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1e9b0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1e9c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e9d0 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
1e9e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e9f0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1ea00 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
1ea10 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
1ea20 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
1ea30 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
1ea40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1ea50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d  age]));.    rc =
1ea60 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1ea70 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
1ea80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ea90 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1eaa0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
1eab0 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
1eac0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1ead0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
1eae0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
1eaf0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
1eb00 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
1eb10 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
1eb20 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
1eb30 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
1eb40 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
1eb50 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
1eb60 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
1eb70 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1eb80 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
1eb90 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
1eba0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
1ebb0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
1ebc0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
1ebd0 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
1ebe0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
1ebf0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
1ec00 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
1ec10 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
1ec20 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
1ec30 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1ec40 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
1ec50 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
1ec60 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
1ec70 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
1ec80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
1ec90 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
1eca0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ecb0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ecc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ecd0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ece0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1ecf0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1ed00 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
1ed10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1ed20 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
1ed30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
1ed40 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1ed50 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1ed60 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1ed70 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1ed80 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
1ed90 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
1eda0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1edb0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
1edc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1edd0 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  OK ){.    pCur->
1ede0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1edf0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
1ee00 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l-1;.    pCur->i
1ee10 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1ee20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1ee30 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
1ee40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1ee50 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1ee60 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
1ee70 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1ee80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1ee90 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1eea0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1eeb0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1eec0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1eed0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1eee0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1eef0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1ef00 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1ef10 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
1ef20 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1ef30 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1ef40 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1ef50 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1ef60 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1ef70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ef80 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1ef90 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1efa0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
1efb0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1efc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1efd0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
1efe0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1eff0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1f000 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1f010 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f020 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
1f030 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1f040 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  1;.      rc = SQ
1f050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1f060 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1f070 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1f080 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1f090 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
1f0a0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1f0b0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1f0c0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
1f0d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f0e0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1f0f0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
1f100 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1f110 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1f120 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1f130 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1f140 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1f150 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1f160 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1f170 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1f180 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1f190 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1f1a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f1b0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
1f1c0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1f1d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
1f1e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f1f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1f210 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1f220 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1f230 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
1f240 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
1f250 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
1f260 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1f270 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
1f280 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
1f290 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
1f2a0 65 53 74 61 74 65 20 26 26 20 70 43 75 72 2d 3e  eState && pCur->
1f2b0 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65 66  atLast ){.#ifdef
1f2c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1f2d0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
1f2e0 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
1f2f0 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
1f300 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
1f310 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
1f320 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1f330 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
1f340 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
1f350 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
1f360 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
1f370 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f380 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
1f390 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
1f3a0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1f3b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
1f3c0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1f3d0 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
1f3e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f3f0 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
1f400 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f410 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1f420 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
1f430 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
1f440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1f450 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1f460 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1f470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f480 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
1f490 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1f4a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
1f4b0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1f4c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1f4d0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1f4e0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1f4f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1f500 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1f510 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f520 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1f530 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1f540 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1f550 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75  pCur);.      pCu
1f560 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d  r->atLast = rc==
1f570 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a  SQLITE_OK ?1:0;.
1f580 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f590 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
1f5a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
1f5b0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1f5c0 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
1f5d0 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
1f5e0 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
1f5f0 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
1f600 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
1f610 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
1f620 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
1f630 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
1f640 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
1f650 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
1f660 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
1f670 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
1f680 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
1f690 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
1f6a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1f6b0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
1f6c0 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
1f6d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
1f6e0 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
1f6f0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
1f700 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
1f710 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
1f720 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
1f730 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
1f740 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
1f750 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
1f760 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
1f770 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
1f780 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
1f790 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
1f7a0 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
1f7b0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
1f7c0 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
1f7d0 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
1f7e0 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
1f7f0 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
1f800 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
1f810 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
1f820 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
1f830 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
1f840 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1f850 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
1f860 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1f870 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1f880 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8a0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1f8b0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
1f8c0 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
1f8d0 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
1f8f0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
1f900 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
1f910 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
1f920 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
1f930 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
1f940 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1f950 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1f960 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1f970 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
1f980 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
1f990 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
1f9a0 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
1f9b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1f9c0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1f9d0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9f0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
1fa00 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
1fa10 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
1fa20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
1fa30 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
1fa40 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
1fa50 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
1fa60 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
1fa70 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1fa80 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
1fa90 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
1faa0 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fac0 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
1fad0 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
1fae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1faf0 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
1fb00 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
1fb10 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
1fb20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
1fb30 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
1fb40 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
1fb50 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1fb60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1fb70 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1fb80 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1fb90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1fba0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1fbb0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1fbc0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1fbd0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
1fbe0 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
1fbf0 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
1fc00 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
1fc10 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
1fc20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
1fc30 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
1fc40 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1fc50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1fc60 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64  D && pCur->valid
1fc70 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72  NKey .   && pCur
1fc80 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1fc90 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
1fca0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
1fcb0 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
1fcc0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1fcd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1fce0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1fcf0 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  if( pCur->atLast
1fd00 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
1fd10 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
1fd20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1fd30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fd40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1fd50 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
1fd60 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
1fd70 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1fd80 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1fd90 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1fda0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
1fdb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1fdc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1fdd0 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b  Page]->isInit );
1fde0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1fdf0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1fe00 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
1fe10 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
1fe20 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1fe30 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1fe40 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
1fe50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fe60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1fe70 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
1fe80 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
1fe90 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
1fea0 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1feb0 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1fec0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1fed0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1fee0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1fef0 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31  ;.    int c = -1
1ff00 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72  ;  /* pRes retur
1ff10 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d  n if table is em
1ff20 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a  pty must be -1 *
1ff30 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  /.    lwr = 0;. 
1ff40 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
1ff50 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
1ff60 20 28 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79   (!pPage->intKey
1ff70 20 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 29 20   && pIdxKey==0) 
1ff80 7c 7c 20 75 70 72 3c 30 20 29 7b 0a 20 20 20 20  || upr<0 ){.    
1ff90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1ffa0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ffb0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
1ffc0 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nish;.    }.    
1ffd0 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b  if( biasRight ){
1ffe0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
1fff0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
20000 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20  = (u16)upr;.    
20010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
20020 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
20030 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75  Page] = (u16)((u
20040 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20  pr+lwr)/2);.    
20050 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  }.    for(;;){. 
20060 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70       int idx = p
20070 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20080 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65  >iPage]; /* Inde
20090 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c  x of current cel
200a0 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  l in pPage */.  
200b0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
200e0 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
200f0 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
20100 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
20110 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
20120 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
20130 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b  ll(pPage, idx) +
20140 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
20150 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
20160 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
20170 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
20180 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  llKey;.        i
20190 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
201a0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
201b0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
201c0 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
201d0 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
201e0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
201f0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
20200 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
20210 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
20220 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
20230 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
20240 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
20250 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20260 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
20270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
20280 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
20290 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
202a0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  sert( nCellKey>i
202b0 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
202c0 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20     c = +1;.     
202d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75     }.        pCu
202e0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
202f0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
20300 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
20310 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lKey;.      }els
20320 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
20330 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
20340 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
20350 20 33 32 37 36 38 20 62 79 74 65 73 2e 20 54 68   32768 bytes. Th
20360 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
20370 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
20380 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
20390 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
203a0 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
203b0 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
203c0 20 70 61 67 65 20 69 73 20 61 74 20 6d 6f 73 74   page is at most
203d0 20 38 31 39 38 20 62 79 74 65 73 2c 20 77 68 69   8198 bytes, whi
203e0 63 68 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  ch may be stored
203f0 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
20400 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
20410 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
20420 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
20430 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
20440 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
20450 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
20460 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
20470 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
20480 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
20490 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
204a0 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
204b0 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
204c0 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
204d0 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
204e0 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
204f0 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
20500 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
20510 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b  t nCell = pCell[
20520 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
20530 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20  !(nCell & 0x80) 
20540 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  && nCell<=pPage-
20550 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
20560 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
20570 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68  ranch runs if th
20580 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
20590 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  eld of the cell 
205a0 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  is a.          *
205b0 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61  * single byte va
205c0 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
205d0 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ord fits entirel
205e0 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20  y on the main.  
205f0 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65          ** b-tre
20600 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
20610 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
20620 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20630 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
20640 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
20650 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
20660 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
20670 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
20680 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
20690 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
206a0 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
206b0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
206c0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
206d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
206e0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
206f0 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
20700 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
20710 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
20720 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
20730 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
20740 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
20750 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
20760 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20770 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
20780 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
20790 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
207a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
207b0 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
207c0 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
207d0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
207e0 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
207f0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
20800 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
20810 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
20820 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
20830 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
20840 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
20850 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
20860 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
20870 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
20880 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
20890 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
208a0 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
208b0 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20  be called. */.  
208c0 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
208d0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
208e0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
208f0 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
20900 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
20910 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
20920 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
20930 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
20940 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
20950 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
20960 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
20970 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
20980 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
20990 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
209a0 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20  loc( nCell );.  
209b0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
209c0 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lKey==0 ){.     
209d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
209e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
209f0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
20a00 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
20a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20a20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
20a30 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
20a40 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
20a50 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 2c 20  r*)pCellKey, 0, 
20a60 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  0);.          c 
20a70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
20a80 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
20a90 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
20aa0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
20ab0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
20ac0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
20ad0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
20ae0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
20af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20b00 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
20b10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
20b20 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
20b30 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
20b40 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
20b50 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
20b60 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
20b70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20b80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20b90 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
20ba0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
20bb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
20bc0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
20bd0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
20be0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20bf0 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
20c00 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
20c10 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
20c20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
20c30 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
20c40 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
20c50 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
20c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
20c70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20c80 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
20c90 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20  (lwr+upr)/2);.  
20ca0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20cb0 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20  lwr==upr+1 );.  
20cc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
20cd0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
20ce0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
20cf0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
20d00 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
20d10 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
20d20 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
20d30 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
20d40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
20d50 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
20d60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20d70 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
20d80 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
20d90 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
20da0 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50   }.    if( chldP
20db0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  g==0 ){.      as
20dc0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
20dd0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
20de0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20df0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
20e00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
20e10 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20  s ) *pRes = c;. 
20e20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20e30 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
20e40 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
20e50 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
20e60 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20e70 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
20e80 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
20e90 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
20ea0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
20eb0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
20ec0 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
20ed0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
20ee0 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
20ef0 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  nish;.  }.moveto
20f00 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72  _finish:.  retur
20f10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
20f20 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  n this version o
20f30 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70  f BtreeMoveto, p
20f40 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20  Key is a packed 
20f50 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20  index record.** 
20f60 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72  such as is gener
20f70 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
20f80 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
20f90 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a  .  Unpack the.**
20fa0 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e   record and then
20fb0 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74   call BtreeMovet
20fc0 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64  oUnpacked() to d
20fd0 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69  o the work..*/.i
20fe0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
20ff0 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f  oveto(.  BtCurso
21000 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20  r *pCur,     /* 
21010 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  Cursor open on t
21020 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73  he btree to be s
21030 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e  earched */.  con
21040 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
21050 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69   /* Packed key i
21060 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
21070 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34  n index */.  i64
21080 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
21090 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20   /* Integer key 
210a0 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a  for tables.  Siz
210b0 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e  e of pKey for in
210c0 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62  dices */.  int b
210d0 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ias,           /
210e0 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f  * Bias search to
210f0 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
21100 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
21110 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
21120 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
21130 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
21140 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
21150 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
21160 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63   code */.  Unpac
21170 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
21180 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65  ey;   /* Unpacke
21190 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
211a0 20 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30   char aSpace[150
211b0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ];          /* T
211c0 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49  emp space for pI
211d0 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64  dxKey - to avoid
211e0 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 0a 20   a malloc */... 
211f0 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
21200 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
21210 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
21220 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
21230 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21240 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
21250 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
21260 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  , pKey,.        
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
21290 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
212a0 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ace));.    if( p
212b0 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
212c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
212d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
212e0 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
212f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21300 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
21310 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
21320 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
21330 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  );.  if( pKey ){
21340 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
21350 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
21360 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20  cord(pIdxKey);. 
21370 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21380 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
21390 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
213a0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
213b0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
213c0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
213d0 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
213e0 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
213f0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
21400 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
21410 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
21420 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
21430 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
21440 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
21450 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
21460 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
21470 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
21480 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
21490 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
214a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
214b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
214c0 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
214d0 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
214e0 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
214f0 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
21500 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
21510 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
21520 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
21530 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
21540 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
21550 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
21560 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
21570 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
21580 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
21590 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
215a0 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
215b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
215c0 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
215d0 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
215e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
215f0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
21600 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
21610 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
21620 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
21630 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
21640 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
21650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
21660 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
21670 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
21680 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
21690 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
216a0 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
216b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
216c0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
216d0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
216e0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
216f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21700 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21710 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
21720 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
21730 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
21740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21750 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
21760 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
21770 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53  =0 );.  if( CURS
21780 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
21790 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
217a0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
217b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
217c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
217d0 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70  >skip>0 ){.    p
217e0 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
217f0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
21800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21810 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
21820 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
21830 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
21840 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
21850 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
21860 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21870 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
21880 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
21890 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50   assert( idx<=pP
218a0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
218b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
218c0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
218d0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
218e0 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
218f0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
21900 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
21910 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
21920 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
21930 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
21940 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
21950 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
21960 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
21970 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
21980 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
21990 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52  pCur);.      *pR
219a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
219b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
219c0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
219d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
219e0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
219f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
21a00 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
21a10 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
21a20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21a30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
21a40 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
21a50 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43  eMoveToParent(pC
21a60 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
21a70 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
21a80 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
21a90 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
21aa0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21ab0 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
21ac0 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
21ad0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
21ae0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
21af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
21b00 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
21b10 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
21b20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21b30 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
21b40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
21b50 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
21b60 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
21b70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21b80 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
21b90 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
21ba0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
21bb0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
21bc0 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
21bd0 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
21be0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
21bf0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
21c00 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
21c10 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
21c20 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
21c30 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
21c40 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
21c50 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
21c60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
21c70 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
21c80 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
21c90 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
21ca0 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
21cb0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
21cc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
21cd0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
21ce0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
21cf0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
21d00 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21d10 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21d20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
21d30 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
21d40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
21d50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
21d60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
21d70 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
21d80 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
21d90 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
21da0 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
21db0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
21dc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21dd0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c   if( pCur->skip<
21de0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
21df0 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
21e00 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
21e10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21e20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
21e30 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
21e40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21e50 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
21e60 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
21e70 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  t );.  if( !pPag
21e80 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
21e90 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
21ea0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
21eb0 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  ];.    rc = move
21ec0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
21ed0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
21ee0 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20  pPage, idx)));. 
21ef0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
21f00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21f10 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76    }.    rc = mov
21f20 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
21f30 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
21f40 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
21f50 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21f60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
21f70 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
21f80 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
21f90 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
21fa0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
21fb0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
21fc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21fd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
21fe0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
21ff0 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43  eMoveToParent(pC
22000 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ur);.    }.    p
22010 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
22020 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
22030 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
22040 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
22050 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
22060 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
22070 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22080 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
22090 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
220a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
220b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
220c0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
220d0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
220e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
220f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
22100 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
22110 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
22120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
22130 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
22140 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
22150 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
22160 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
22170 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
22180 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
22190 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
221a0 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
221b0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
221c0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
221d0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
221e0 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
221f0 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
22200 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
22210 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
22220 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
22230 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
22240 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
22250 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
22260 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
22270 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
22280 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
22290 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
222a0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
222b0 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
222c0 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
222d0 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
222e0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
222f0 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
22300 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
22310 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
22320 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72  *ppPage if an er
22330 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ror is returned.
22340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
22350 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
22360 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
22370 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72  a (feeble) effor
22380 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
22390 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
223a0 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
223b0 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
223c0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
223d0 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
223e0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
223f0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
22400 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
22410 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22420 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
22430 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
22440 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
22450 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
22460 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61  the "exact" para
22470 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
22480 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d  and the page-num
22490 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74  ber nearby exist
224a0 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  s .** anywhere o
224b0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
224c0 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
224d0 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  enteed to be ret
224e0 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69  urned. This.** i
224f0 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61  s only used by a
22500 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
22510 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ases when alloca
22520 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
22530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22540 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
22550 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
22560 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt, .  MemPage *
22570 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f  *ppPage, .  Pgno
22580 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f   *pPgno, .  Pgno
22590 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78   nearby,.  u8 ex
225a0 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  act.){.  MemPage
225b0 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
225c0 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
225d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
225e0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
225f0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20  ist */.  int k; 
22600 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22610 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
22620 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
22630 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
22640 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
22650 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
22660 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
22670 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
22680 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
22690 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
226a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
226b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
226c0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
226d0 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
226e0 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
226f0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
22700 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65  t(pBt);.  n = ge
22710 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
22720 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66  aData[36]);.  if
22730 28 20 6e 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  ( n>mxPage ){.  
22740 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22750 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
22760 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
22770 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
22780 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
22790 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
227a0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
227b0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
227c0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
227d0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
227e0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
227f0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
22800 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
22810 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
22820 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
22830 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
22840 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
22850 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
22860 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
22870 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
22880 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
22890 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
228a0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
228b0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
228c0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
228d0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
228e0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
228f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
22900 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
22910 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50  t && nearby<=mxP
22920 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20  age ){.      u8 
22930 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73  eType;.      ass
22940 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
22950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22960 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
22970 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
22980 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
22990 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
229a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
229b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
229c0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
229d0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
229e0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
229f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
22a00 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61      *pPgno = nea
22a10 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rby;.    }.#endi
22a20 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
22a30 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
22a40 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
22a50 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
22a60 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
22a70 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
22a80 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
22a90 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
22aa0 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
22ab0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
22ac0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
22ad0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
22ae0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
22af0 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
22b00 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
22b10 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
22b20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
22b30 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
22b40 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
22b50 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
22b60 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
22b70 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
22b80 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
22b90 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
22ba0 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
22bb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
22bc0 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
22bd0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
22be0 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f   located..    */
22bf0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
22c00 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
22c10 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
22c20 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
22c30 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
22c40 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
22c50 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
22c60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22c70 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
22c80 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
22c90 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
22ca0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 54 72   }.      if( iTr
22cb0 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  unk>mxPage ){.  
22cc0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22cd0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22cf0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22d00 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
22d10 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
22d20 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
22d30 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
22d40 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
22d50 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
22d60 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
22d70 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
22d80 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
22d90 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
22da0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
22db0 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
22dc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
22dd0 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
22de0 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
22df0 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
22e00 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
22e10 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
22e20 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
22e30 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
22e40 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
22e50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
22e60 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
22e70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22e80 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
22e90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22ea0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22eb0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
22ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
22ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
22ee0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
22ef0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
22f00 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
22f10 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
22f20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
22f30 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
22f40 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
22f50 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
22f60 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
22f70 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
22f80 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
22f90 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
22fa0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
22fb0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
22fc0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
22fd0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74   }else if( k>pBt
22fe0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
22ff0 20 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   2 ){.        /*
23000 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
23010 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
23020 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
23030 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
23040 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
23050 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
23060 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
23070 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
23080 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
23090 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
230a0 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
230b0 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
230c0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
230d0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
230e0 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
230f0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
23100 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
23110 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
23120 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
23130 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
23140 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
23150 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
23160 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
23170 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
23180 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
23190 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
231a0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
231b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
231c0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
231d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
231e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
231f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
23200 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
23210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23220 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
23230 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
23240 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
23250 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
23260 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
23270 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
23280 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
23290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
232a0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
232b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
232c0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
232d0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
232e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
232f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
23300 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
23310 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
23320 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
23330 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
23340 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
23350 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
23360 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
23370 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
23380 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
23390 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
233a0 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
233b0 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
233c0 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
233d0 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
233e0 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
233f0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
23400 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
23410 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d   if( iNewTrunk>m
23420 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20  xPage ){ .      
23430 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23440 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23450 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
23460 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
23470 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
23480 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
23490 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
234a0 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
234b0 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
234c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
234d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
234e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
234f0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
23500 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
23510 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
23520 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23530 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
23540 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
23550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23560 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23570 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
23580 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
23590 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
235a0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
235b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
235c0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
235d0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
235e0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
235f0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
23600 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
23610 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
23620 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
23630 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
23640 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
23650 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
23660 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
23670 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
23680 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
23690 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
236a0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
236b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
236c0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
236d0 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
236e0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
236f0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
23700 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
23710 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
23720 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
23730 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
23740 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23750 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
23760 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
23770 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
23780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
23790 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
237a0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
237b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
237c0 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
237d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
237e0 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
237f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23800 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
23810 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
23820 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
23830 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
23840 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
23850 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
23860 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
23870 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
23880 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
23890 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
238a0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c  /.        int cl
238b0 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
238c0 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
238d0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
238e0 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
238f0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
23900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23910 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
23920 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
23930 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23940 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
23950 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
23960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23970 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
23980 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c            int i,
23990 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
239a0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
239b0 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67          dist = g
239c0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
239d0 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
239e0 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c         if( dist<
239f0 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74  0 ) dist = -dist
23a00 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
23a10 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
23a20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
23a30 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  d2 = get4byte(&a
23a40 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
23a50 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
23a60 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32     if( d2<0 ) d2
23a70 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20   = -d2;.        
23a80 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
23a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23aa0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
23ac0 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
23ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
23ae0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23af0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
23b00 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
23b10 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
23b20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
23b30 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
23b40 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
23b50 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
23b60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23b70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23b80 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
23b90 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
23ba0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
23bb0 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
23bc0 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e  List || iPage==n
23bd0 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
23be0 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
23bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
23c00 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   nPage;.        
23c10 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
23c20 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61 67  ;.          nPag
23c30 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
23c40 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  nt(pBt);.       
23c50 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50     if( *pPgno>nP
23c60 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
23c70 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20     /* Free page 
23c80 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
23c90 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  he file */.     
23ca0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23cb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
23cd0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
23ce0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
23cf0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
23d00 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
23d10 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
23d20 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
23d50 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
23d60 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
23d70 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
23d80 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
23d90 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
23da0 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
23db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
23dc0 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
23dd0 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
23de0 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
23df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23e00 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
23e10 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
23e20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23e30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
23e40 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e  iteable(pTrunk->
23e50 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
23e60 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
23e70 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
23e80 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
23e90 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
23ea0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
23eb0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
23ec0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
23ed0 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
23ee0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23ef0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23f10 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
23f20 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
23f30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
23f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
23f60 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
23f70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
23f80 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
23f90 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
23fa0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
23fb0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23fc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
23fd0 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
23fe0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
23ff0 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
24000 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
24010 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
24020 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
24030 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
24040 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
24050 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
24060 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
24070 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
24080 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
24090 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67  t(pBt);.    *pPg
240a0 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a  no = nPage + 1;.
240b0 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d  .    if( *pPgno=
240c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
240d0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
240e0 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
240f0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
24100 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
24110 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
24120 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
24130 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
24140 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20   *pPgno) ){.    
24150 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
24160 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
24170 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
24180 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
24190 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
241a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
241b0 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
241c0 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
241d0 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
241e0 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
241f0 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
24200 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
24210 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
24220 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
24230 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
24240 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
24250 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
24260 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
24270 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
24280 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67  p page)\n", *pPg
24290 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  no));.      asse
242a0 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
242b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
242c0 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
242d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
242e0 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
242f0 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
24300 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
24320 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24330 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
24340 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
24350 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
24360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
24370 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
24380 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
24390 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50  +;.      if( *pP
243a0 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
243b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28  E_PAGE(pBt) ){ (
243c0 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20  *pPgno)++; }.   
243d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61   }.#endif..    a
243e0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
243f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
24400 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
24410 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
24420 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
24430 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
24440 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
24450 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
24460 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24470 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
24480 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
24490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
244a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
244b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
244c0 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
244d0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
244e0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
244f0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
24500 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
24510 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
24520 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
24530 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
24540 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
24550 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
24560 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
24570 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
24590 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
245a0 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
245b0 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
245c0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
245d0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
245e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
245f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
24600 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
24610 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
24620 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
24630 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
24640 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24650 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24660 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
24670 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
24680 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24690 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
246a0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
246b0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
246c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
246d0 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
246e0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
246f0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
24700 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
24710 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
24720 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
24730 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
24740 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
24750 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
24760 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
24770 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
24780 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
24790 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
247a0 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
247b0 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
247c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
247d0 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
247e0 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
247f0 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
24800 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
24810 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
24820 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
24830 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
24840 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
24850 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
24860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
24870 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
24880 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
24890 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
248a0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
248b0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
248c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
248d0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
248e0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
248f0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
24900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24910 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
24920 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
24930 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
24940 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
24950 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
24960 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
24970 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
24980 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249a0 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
249b0 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
249c0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
249d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
249f0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
24a00 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
24a30 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
24a40 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
24a50 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
24a60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
24a70 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
24a80 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31   assert( iPage>1
24a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
24aa0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
24ab0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
24ac0 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50   );..  if( pMemP
24ad0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
24ae0 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
24af0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
24b00 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
24b10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
24b20 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
24b30 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
24b40 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
24b50 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
24b60 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
24b70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
24b80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24b90 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
24ba0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
24bb0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
24bc0 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
24bd0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
24be0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
24bf0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
24c00 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
24c10 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
24c20 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
24c30 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49    /* If the SQLI
24c40 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
24c50 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
24c60 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
24c70 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79   then.  ** alway
24c80 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
24c90 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
24ca0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
24cb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21 70  ..  */.  if( (!p
24cc0 50 61 67 65 20 26 26 20 28 72 63 20 3d 20 73 71  Page && (rc = sq
24cd0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
24ce0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
24cf0 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c  Page, 0))).   ||
24d00 20 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20              (rc 
24d10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
24d20 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
24d30 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f  ge)).  ){.    go
24d40 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
24d50 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50  .  }.  memset(pP
24d60 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
24d70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
24d80 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ize);.#endif..  
24d90 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
24da0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
24db0 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
24dc0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
24dd0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
24de0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
24df0 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
24e00 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
24e10 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
24e20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
24e30 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
24e40 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29  MAP_FREEPAGE, 0)
24e50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
24e60 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
24e70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
24e80 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
24e90 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
24ea0 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
24eb0 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
24ec0 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
24ed0 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
24ee0 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
24ef0 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
24f00 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
24f10 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
24f20 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
24f30 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
24f40 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
24f50 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
24f60 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
24f70 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
24f80 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
24f90 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
24fa0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
24fb0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
24fc0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
24fd0 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
24fe0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
24ff0 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
25000 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
25010 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
25020 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
25030 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 3b 20  .    int nLeaf; 
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25050 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
25060 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
25070 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
25080 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
25090 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
250a0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
250b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
250c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
250d0 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
250e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
250f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25100 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
25110 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
25120 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
25130 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
25140 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  4]);.    if( nLe
25150 61 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  af<0 ){.      rc
25160 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
25170 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
25180 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
25190 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
251a0 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65  Leaf<pBt->usable
251b0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
251c0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
251d0 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
251e0 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
251f0 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
25200 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
25210 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
25220 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
25230 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
25240 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
25250 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
25260 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
25270 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
25280 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
25290 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
252a0 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
252b0 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
252c0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
252d0 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
252e0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
252f0 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
25300 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
25310 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
25320 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
25330 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
25340 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
25350 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
25360 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
25370 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
25380 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
25390 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
253a0 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
253b0 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
253c0 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
253d0 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
253e0 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
253f0 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
25400 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74 20  ain to restrict 
25410 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
25420 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
25430 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
25440 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
25450 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
25460 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
25470 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
25480 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
25490 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
254a0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
254b0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
254c0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
254d0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
254e0 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
254f0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
25500 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
25510 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
25520 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25530 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
25540 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
25550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25560 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
25570 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
25580 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
25590 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
255a0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
255b0 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
255c0 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge);.#ifndef SQL
255d0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
255e0 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  E.        if( pP
255f0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
25600 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
25610 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
25620 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
25630 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
25640 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
25650 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
25660 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
25670 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
25680 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
25690 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
256a0 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
256b0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
256c0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
256d0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
256e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
256f0 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
25700 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
25710 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
25720 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
25730 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
25740 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
25750 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
25760 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
25770 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
25780 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
25790 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
257a0 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
257b0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
257c0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
257d0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
257e0 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
257f0 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
25800 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
25810 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
25820 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
25830 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
25840 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
25850 69 66 28 20 20 20 28 28 21 70 50 61 67 65 29 20  if(   ((!pPage) 
25860 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  && (0 != (rc = s
25870 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
25880 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
25890 70 50 61 67 65 2c 20 30 29 29 29 29 0a 20 20 20  pPage, 0)))).   
258a0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
258b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
258c0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
258d0 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f  e))).  ){.    go
258e0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
258f0 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
25900 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
25910 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
25920 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
25930 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
25940 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
25950 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
25960 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
25970 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
25980 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
25990 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
259a0 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
259b0 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
259c0 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
259d0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
259e0 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
259f0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
25a00 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
25a10 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
25a20 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  .}.static int fr
25a30 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
25a40 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
25a50 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
25a60 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
25a70 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f  age->pgno);.}../
25a80 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
25a90 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
25aa0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
25ab0 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
25ac0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
25ad0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
25ae0 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
25af0 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
25b00 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
25b10 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
25b20 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
25b30 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
25b40 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
25b50 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50 61 67  l;.  u16 ovflPag
25b60 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
25b70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25b80 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
25b90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
25ba0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
25bb0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
25bc0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
25bd0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
25be0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
25bf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
25c00 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
25c10 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
25c20 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
25c30 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
25c40 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
25c50 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
25c60 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
25c70 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
25c80 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
25c90 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
25ca0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
25cb0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
25cc0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
25cd0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
25ce0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
25cf0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
25d00 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
25d10 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
25d20 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
25d30 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
25d40 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
25d50 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
25d60 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
25d70 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72  | ovflPgno>pager
25d80 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
25d90 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
25da0 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
25db0 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
25dc0 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
25dd0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
25de0 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
25df0 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
25e00 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
25e10 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
25e20 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
25e30 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
25e40 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
25e50 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
25e60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
25e70 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
25e80 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
25e90 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
25ea0 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
25eb0 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
25ec0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
25ed0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
25ee0 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
25ef0 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
25f00 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  gno);.    if( pO
25f10 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
25f20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
25f30 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
25f40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
25f50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
25f60 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
25f70 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
25f80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
25f90 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
25fa0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
25fb0 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
25fc0 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
25fd0 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
25fe0 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
25ff0 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
26000 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
26010 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
26020 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
26030 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
26040 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
26050 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
26060 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
26070 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
26080 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
26090 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
260a0 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
260b0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
260c0 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
260d0 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
260e0 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
260f0 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
26100 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
26110 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
26120 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
26130 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
26140 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
26150 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
26160 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
26170 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
26180 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
26190 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
261a0 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
261b0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
261c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
261d0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
261e0 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
261f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
26200 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
26210 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
26220 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
26230 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
26240 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
26250 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
26260 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
26270 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
26280 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
26290 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262b0 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
262c0 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
262d0 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
262e0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
262f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
26300 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
26310 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
26320 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
26330 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
26340 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
26350 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
26360 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
26370 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
26380 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
26390 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
263a0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
263b0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
263c0 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
263d0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
263e0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
263f0 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
26400 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
26410 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
26420 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
26430 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
26440 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
26450 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
26460 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
26470 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
26480 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
26490 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
264a0 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
264b0 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
264c0 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
264d0 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
264e0 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
264f0 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
26500 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
26510 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
26520 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
26530 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
26540 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
26550 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
26560 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
26570 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
26580 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
26590 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
265a0 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
265b0 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
265c0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
265d0 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
265e0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
265f0 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
26600 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
26610 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
26620 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
26630 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
26640 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
26650 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Key);.  sqlite3B
26660 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
26670 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
26680 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
26690 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
266a0 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
266b0 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
266c0 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
266d0 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33   info.nData==(u3
266e0 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20  2)(nData+nZero) 
266f0 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
26700 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
26710 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  /.  nPayload = n
26720 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
26730 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
26740 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
26750 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
26760 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
26770 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
26780 20 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3e 30   .    if( nKey>0
26790 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
267a0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  y==0 ){.      re
267b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
267c0 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  UPT;.    }.    n
267d0 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29  Payload += (int)
267e0 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
267f0 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
26800 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
26810 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
26820 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
26830 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
26840 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
26850 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
26860 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
26870 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
26880 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
26890 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
268a0 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
268b0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
268c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
268d0 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
268e0 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
268f0 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
26900 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
26910 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
26920 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
26930 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
26940 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
26950 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
26960 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
26970 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
26980 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
26990 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
269a0 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
269b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
269c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
269d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
269e0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
269f0 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
26a00 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
26a10 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
26a20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
26a30 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
26a40 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
26a50 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
26a60 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
26a70 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
26a80 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
26a90 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
26aa0 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
26ab0 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
26ac0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
26ad0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
26ae0 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
26af0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
26b00 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
26b10 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
26b20 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
26b30 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
26b40 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
26b50 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
26b60 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
26b70 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
26b80 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
26b90 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
26ba0 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
26bb0 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
26bc0 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
26bd0 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
26be0 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
26bf0 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c  ninitialised val
26c00 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
26c10 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
26c20 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
26c30 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
26c40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
26c50 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
26c60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26c70 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
26c80 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
26c90 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
26ca0 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
26cb0 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  W1);.        rc 
26cc0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
26cd0 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
26ce0 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20  , pgnoPtrmap);. 
26cf0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
26d00 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
26d10 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
26d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26d30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
26d40 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
26d50 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
26d60 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
26d70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26d80 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
26d90 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
26da0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
26db0 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
26dc0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
26dd0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
26de0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
26df0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
26e00 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
26e10 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
26e20 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
26e30 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
26e40 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
26e50 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
26e60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
26e70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
26e80 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
26e90 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
26ea0 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
26eb0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
26ec0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
26ed0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
26ee0 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
26ef0 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
26f00 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
26f10 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
26f20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
26f30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
26f40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
26f50 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
26f60 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
26f70 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
26f80 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
26f90 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
26fa0 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
26fb0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
26fc0 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
26fd0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
26fe0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
26ff0 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
27000 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
27010 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
27020 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
27030 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
27040 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
27050 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
27060 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
27070 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
27080 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
27090 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
270a0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
270b0 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
270c0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
270d0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
270e0 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
270f0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
27100 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
27110 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
27120 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
27130 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
27140 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
27150 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
27160 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
27170 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
27180 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
27190 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
271a0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
271b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
271c0 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
271d0 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
271e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
271f0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
27200 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
27210 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
27220 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
27230 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
27240 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
27250 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
27260 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
27270 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
27280 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
27290 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
272a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
272b0 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
272c0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
272d0 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
272e0 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
272f0 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
27300 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
27310 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
27320 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
27330 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
27340 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
27350 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
27360 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
27370 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
27380 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
27390 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
273a0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
273b0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
273c0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
273d0 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
273e0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
273f0 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
27400 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
27410 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
27420 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
27430 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
27440 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
27450 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
27460 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
27470 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
27480 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
27490 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
274a0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
274b0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
274c0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
274d0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
274e0 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  t dropCell(MemPa
274f0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
27500 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69  dx, int sz){.  i
27510 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
27520 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
27530 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
27540 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
27550 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
27560 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
27570 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
27580 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
27590 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
275a0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
275b0 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
275c0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
275d0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
275e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
275f0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
27600 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
27610 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
27620 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
27630 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
27640 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
27650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
27660 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
27670 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
27680 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
27690 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
276a0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
276b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
276c0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
276d0 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b  ;.  ptr = &data[
276e0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
276f0 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63  t + 2*idx];.  pc
27700 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
27710 3b 0a 20 20 69 66 28 20 28 70 63 3c 70 50 61 67  ;.  if( (pc<pPag
27720 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
27730 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
27740 29 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b 73 7a  ).     || (pc+sz
27750 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
27760 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  bleSize) ){.    
27770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
27780 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
27790 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
277a0 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
277b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
277c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
277d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 6f 72  rn rc;.  }.  for
277e0 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67  (i=idx+1; i<pPag
277f0 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70  e->nCell; i++, p
27800 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b  tr+=2){.    ptr[
27810 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20  0] = ptr[2];.   
27820 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d   ptr[1] = ptr[3]
27830 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
27840 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
27850 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
27860 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
27870 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
27880 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
27890 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
278a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
278b0 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
278c0 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
278d0 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
278e0 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
278f0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
27900 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
27910 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
27920 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
27930 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
27940 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
27950 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
27960 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
27970 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
27980 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
27990 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
279a0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
279b0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
279c0 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
279d0 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
279e0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e  Page->aOvfl[] an
279f0 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
27a00 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
27a10 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
27a20 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
27a30 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
27a40 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
27a50 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
27a60 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
27a70 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
27a80 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
27a90 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
27aa0 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
27ab0 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  emented..**.** I
27ac0 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  f nSkip is non-z
27ad0 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ero, then do not
27ae0 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20   copy the first 
27af0 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
27b00 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  he.** cell. The 
27b10 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72  caller will over
27b20 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72  write them after
27b30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
27b40 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53  eturns. If.** nS
27b50 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
27b60 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20   then pCell may 
27b70 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  not point to an 
27b80 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c  invalid memory l
27b90 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74  ocation .** (but
27ba0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20   pCell+nSkip is 
27bb0 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a  always valid)..*
27bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
27bd0 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
27be0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
27bf0 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
27c00 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
27c10 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
27c20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
27c30 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
27c40 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
27c50 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
27c60 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
27c70 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
27c80 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
27c90 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
27ca0 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
27cb0 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
27cc0 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
27cd0 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
27ce0 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
27cf0 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
27d00 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20   u8 nSkip       
27d10 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69     /* Do not wri
27d20 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  te the first nSk
27d30 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ip bytes of the 
27d40 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  cell */.){.  int
27d50 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f   idx;          /
27d60 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
27d70 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
27d80 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
27d90 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
27da0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
27db0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  er */.  int top;
27dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
27dd0 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65  st byte of conte
27de0 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20  nt for any cell 
27df0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
27e00 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
27e10 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
27e20 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
27e30 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
27e40 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
27e50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
27e60 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
27e70 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
27e80 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
27e90 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
27ea0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
27eb0 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66  t into data[] of
27ec0 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
27ed0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
27ee0 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
27ef0 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
27f00 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
27f10 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
27f20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
27f30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
27f40 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
27f50 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
27f60 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f    /* Used for mo
27f70 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ving information
27f80 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b   around in data[
27f90 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ] */..  assert( 
27fa0 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
27fb0 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
27fc0 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
27fd0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
27fe0 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
27ff0 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
28000 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
28010 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74  5460 );.  assert
28020 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
28030 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
28040 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20  age->aOvfl) );. 
28050 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
28060 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
28070 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  pCell) );.  asse
28080 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
28090 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
280a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
280b0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
280c0 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
280d0 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
280e0 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
280f0 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
28100 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
28110 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
28120 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
28130 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  mp;.    }.    j 
28140 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
28150 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
28160 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
28170 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73  (pPage->aOvfl)/s
28180 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
28190 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70  fl[0])) );.    p
281a0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
281b0 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
281c0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
281d0 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a  ].idx = (u16)i;.
281e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
281f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28200 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
28210 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
28220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28230 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
28240 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
28250 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
28260 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
28270 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
28280 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
28290 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
282a0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
282b0 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
282c0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
282d0 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
282e0 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
282f0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
28300 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
28310 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
28320 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
28330 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
28340 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
28350 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
28360 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
28370 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
28380 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28390 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
283a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
283b0 20 20 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20    }.      top = 
283c0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
283d0 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73  dr+5]);.      as
283e0 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c  sert( end + sz <
283f0 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20  = top );.    }. 
28400 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74     idx = allocat
28410 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
28420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
28430 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dx>0 );.    asse
28440 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62  rt( end <= get2b
28450 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
28460 29 20 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78  ) );.    if (idx
28470 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
28480 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a  ->usableSize) {.
28490 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
284a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
284b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
284c0 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
284d0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
284e0 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  2;.    memcpy(&d
284f0 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
28500 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
28510 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28  nSkip);.    for(
28520 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61  j=end-2, ptr=&da
28530 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d  ta[j]; j>ins; j-
28540 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20  =2, ptr-=2){.   
28550 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
28560 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31  -2];.      ptr[1
28570 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20  ] = ptr[-1];.   
28580 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
28590 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
285a0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
285b0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
285c0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e  ge->nCell);.#ifn
285d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
285e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
285f0 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
28600 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
28610 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
28620 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
28630 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
28640 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
28650 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
28660 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
28670 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
28680 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
28690 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
286a0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
286b0 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fo;.      sqlite
286c0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
286d0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
286e0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61   &info);.      a
286f0 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
28700 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
28710 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
28720 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
28730 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f  ;.      if( info
28740 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
28750 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
28760 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
28770 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
28780 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
28790 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
287a0 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f  Page->pBt, pgnoO
287b0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
287c0 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
287d0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
287e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
287f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28800 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
28810 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
28820 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28830 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
28840 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
28850 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
28860 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
28870 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
28880 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
28890 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
288a0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
288b0 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
288c0 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
288d0 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
288e0 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
288f0 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
28900 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
28910 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
28920 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
28930 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
28940 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
28950 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
28960 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31  l bodies */.  u1
28970 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  6 *aSize        
28980 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
28990 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
289a0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
289b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
289c0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  */.  u8 *pCellpt
289d0 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  r;     /* Addres
289e0 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70  s of next cell p
289f0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
28a00 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a  cellbody;     /*
28a10 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
28a20 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20   cell body */.  
28a30 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
28a40 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
28a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28a60 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66  ointer to data f
28a70 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  or pPage */.  co
28a80 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
28a90 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
28aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
28ab0 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
28ac0 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
28ad0 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20  t int nUsable = 
28ae0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
28af0 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
28b00 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a  e size of page *
28b10 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
28b20 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
28b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
28b40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
28b50 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
28b60 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
28b70 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65   nCell>=0 && nCe
28b80 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
28b90 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
28ba0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
28bb0 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74  5460 );.  assert
28bc0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
28bd0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
28be0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
28bf0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
28c00 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20  e page has just 
28c10 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a  been zeroed by z
28c20 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61  eroPage() */.  a
28c30 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
28c40 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
28c50 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61  rt( get2byte(&da
28c60 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61  ta[hdr+5])==nUsa
28c70 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70  ble );..  pCellp
28c80 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
28c90 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e  ->cellOffset + n
28ca0 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
28cb0 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
28cc0 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
28cd0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
28ce0 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
28cf0 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61     cellbody -= a
28d00 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Size[i];.    put
28d10 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
28d20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d  cellbody);.    m
28d30 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
28d40 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
28d50 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d  , aSize[i]);.  }
28d60 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
28d70 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29  a[hdr+3], nCell)
28d80 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
28d90 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62  ta[hdr+5], cellb
28da0 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
28db0 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32  Free -= (nCell*2
28dc0 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c   + nUsable - cel
28dd0 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d  lbody);.  pPage-
28de0 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43  >nCell = (u16)nC
28df0 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
28e00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
28e10 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
28e20 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
28e30 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
28e40 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
28e50 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
28e60 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
28e70 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
28e80 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
28e90 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
28ea0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
28eb0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
28ec0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
28ed0 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
28ee0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
28ef0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
28f00 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
28f10 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
28f20 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
28f30 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
28f40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
28f50 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
28f60 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
28f70 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
28f80 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
28f90 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
28fa0 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
28fb0 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
28fc0 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
28fd0 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
28fe0 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
28ff0 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
29000 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
29010 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
29020 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
29030 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
29040 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
29050 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
29060 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
29070 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29080 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
29090 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
290a0 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
290b0 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
290c0 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
290d0 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
290e0 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66  balance */...#if
290f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29100 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
29110 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
29120 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
29130 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
29140 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
29150 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
29160 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
29170 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
29180 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
29190 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
291a0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
291b0 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
291c0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
291d0 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
291e0 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
291f0 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
29200 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
29210 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
29220 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
29230 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
29240 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
29250 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
29260 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
29270 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
29280 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
29290 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
292a0 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
292b0 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
292c0 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
292d0 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
292e0 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
292f0 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
29300 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
29310 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
29320 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
29330 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
29340 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
29350 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
29360 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
29370 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
29380 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
29390 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
293a0 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
293b0 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
293c0 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
293d0 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
293e0 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
293f0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
29400 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
29410 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70  e..**.** The pSp
29420 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73  ace buffer is us
29430 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65  ed to store a te
29440 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20  mporary copy of 
29450 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63  the divider.** c
29460 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ell that will be
29470 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70   inserted into p
29480 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63  Parent. Such a c
29490 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
294a0 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65  a 4.** byte page
294b0 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64   number followed
294c0 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c   by a variable l
294d0 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49  ength integer. I
294e0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
294f0 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74  , at most 13 byt
29500 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53  es. Hence the pS
29510 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74  pace buffer must
29520 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20   be at.** least 
29530 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  13 bytes in size
29540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29550 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
29560 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
29570 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
29580 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42  u8 *pSpace){.  B
29590 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70  tShared *const p
295a0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
295b0 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61      /* B-Tree Da
295c0 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50  tabase */.  MemP
295d0 61 67 65 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20  age *pNew = 0;  
295e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295f0 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
29600 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ted page */.  in
29610 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
29620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29630 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
29640 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
29650 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
29660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29670 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e  age number of pN
29680 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ew */..  assert(
29690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
296a0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
296b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
296c0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
296d0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
296e0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
296f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29700 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
29710 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ;..  if( pPage->
29720 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72  nCell<=0 ) retur
29730 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
29740 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _BKPT;..  /* All
29750 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
29760 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c  . This page will
29770 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68   become the righ
29780 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20  t-sibling of .  
29790 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74  ** pPage. Make t
297a0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
297b0 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74  ritable, so that
297c0 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
297d0 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62   cell.  ** may b
297e0 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62  e inserted. If b
297f0 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74  oth these operat
29800 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73  ions are success
29810 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20  ful, proceed..  
29820 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
29830 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
29840 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
29850 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
29860 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29870 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20  .    u8 *pOut = 
29880 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20  &pSpace[4];.    
29890 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67  u8 *pCell = pPag
298a0 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  e->aOvfl[0].pCel
298b0 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c  l;.    u16 szCel
298c0 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
298d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
298e0 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20     u8 *pStop;.. 
298f0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
29900 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
29910 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
29920 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
29930 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
29940 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  ==(PTF_INTKEY|PT
29950 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
29960 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  EAF) );.    zero
29970 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49  Page(pNew, PTF_I
29980 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
29990 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  TA|PTF_LEAF);.  
299a0 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
299b0 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
299c0 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20  &szCell);.  .   
299d0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
299e0 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
299f0 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
29a00 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
29a10 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
29a20 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
29a30 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
29a40 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
29a50 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
29a60 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
29a70 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
29a80 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
29a90 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
29aa0 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
29ab0 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
29ac0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
29ad0 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
29ae0 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
29af0 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
29b00 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
29b10 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
29b20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
29b30 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
29b40 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
29b50 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
29b60 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
29b70 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
29b80 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
29b90 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
29ba0 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
29bb0 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
29bc0 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
29bd0 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
29be0 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
29bf0 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
29c00 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
29c10 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
29c20 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
29c30 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
29c40 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
29c50 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
29c60 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
29c70 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
29c80 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
29c90 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
29ca0 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
29cb0 70 75 74 34 62 79 74 65 28 70 53 70 61 63 65 2c  put4byte(pSpace,
29cc0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
29cd0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
29ce0 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
29cf0 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
29d00 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
29d10 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
29d20 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20  (pCell++)&0x80) 
29d30 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
29d40 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
29d50 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
29d60 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20  le( ((*(pOut++) 
29d70 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78  = *(pCell++))&0x
29d80 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
29d90 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  op );..    /* In
29da0 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76  sert the new div
29db0 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70  ider cell into p
29dc0 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  Parent */.    in
29dd0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
29de0 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  , pParent->nCell
29df0 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28  , pSpace, (int)(
29e00 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 20 30 2c  pOut-pSpace), 0,
29e10 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74   0);..    /* Set
29e20 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
29e30 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72   pointer of pPar
29e40 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ent to point to 
29e50 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
29e60 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
29e70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
29e80 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
29e90 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20  +8], pgnoNew);. 
29ea0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
29eb0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
29ec0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
29ed0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
29ee0 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  map.    ** with 
29ef0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
29f00 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
29f10 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
29f20 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  he .    ** cell 
29f30 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
29f40 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
29f50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29f60 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
29f70 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
29f80 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
29f90 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
29fa0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
29fb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
29fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29fd0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
29fe0 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b  utOvfl(pNew, 0);
29ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2a000 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
2a010 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
2a020 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
2a030 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2a040 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72  (pNew);.  }..  r
2a050 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2a060 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2a070 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
2a080 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
2a090 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
2a0a0 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  tes Cells on pPa
2a0b0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a  ge and up to NN*
2a0c0 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66  2 siblings.** of
2a0d0 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61   pPage so that a
2a0e0 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
2a0f0 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f  out the same amo
2a100 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
2a110 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e  e..** Usually NN
2a120 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
2a130 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
2a140 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65  e is used in the
2a150 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74   balancing,.** t
2a160 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69  hough more sibli
2a170 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
2a180 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20  rom one side if 
2a190 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72  pPage is the fir
2a1a0 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68  st.** or last ch
2a1b0 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
2a1c0 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73  t.  If pPage has
2a1d0 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e   fewer than 2*NN
2a1e0 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f   siblings.** (so
2a1f0 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
2a200 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
2a210 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f   pPage is the ro
2a220 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a  ot page or a .**
2a230 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20   child of root) 
2a240 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
2a250 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74  le siblings part
2a260 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2a270 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
2a280 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
2a290 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20  blings of pPage 
2a2a0 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
2a2b0 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
2a2c0 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f  by one or.** two
2a2d0 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
2a2e0 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
2a2f0 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
2a300 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72  over full. The r
2a310 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73  oot page.** is s
2a320 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c  pecial and is al
2a330 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72  lowed to be near
2a340 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61  ly empty. If pPa
2a350 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f  ge is .** the ro
2a360 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
2a370 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
2a380 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  ree might be inc
2a390 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63  reased.** or dec
2a3a0 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61  reased by one, a
2a3b0 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20  s necessary, to 
2a3c0 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61  keep the root pa
2a3d0 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ge from being.**
2a3e0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d   overfull or com
2a3f0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a  pletely empty..*
2a400 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
2a410 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2a420 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
2a430 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e   of the Cells on
2a440 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
2a450 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
2a460 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d  stored in pPage-
2a470 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20  >aData[].  This 
2a480 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
2a490 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
2a4a0 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20  rfull.  Part of 
2a4b0 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  the job of this 
2a4c0 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a  routine is to.**
2a4d0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43   make sure all C
2a4e0 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f  ells for pPage o
2a4f0 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e  nce again fit in
2a500 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
2a510 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
2a520 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
2a530 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f  g the siblings o
2a540 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72  f pPage, the par
2a550 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20  ent of pPage.** 
2a560 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65  might become ove
2a570 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
2a580 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70  ll.  If that hap
2a590 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20  pens, then this 
2a5a0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
2a5b0 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
2a5c0 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a   on the parent..
2a5d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
2a5e0 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
2a5f0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
2a600 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
2a610 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
2a620 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
2a630 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
2a640 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
2a650 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
2a660 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
2a670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a680 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2a690 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2a6a0 2c 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78  , int iParentIdx
2a6b0 2c 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65  , u8 *aOvflSpace
2a6c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2a6d0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
2a6e0 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
2a6f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
2a700 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
2a710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2a720 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
2a730 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
2a740 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
2a750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2a760 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
2a770 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
2a780 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
2a790 6e 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  nOld = 0;       
2a7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a7b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
2a7c0 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
2a7d0 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
2a7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a7f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
2a800 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
2a810 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
2a820 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2a830 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
2a840 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
2a850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a860 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
2a870 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
2a880 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
2a890 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2a8a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2a8b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2a8c0 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  nt leafCorrectio
2a8d0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
2a8e0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
2a8f0 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
2a900 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
2a910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a920 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
2a930 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
2a940 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
2a950 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
2a960 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
2a970 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
2a980 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
2a990 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
2a9a0 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
2a9b0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2a9c0 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
2a9d0 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
2a9e0 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
2a9f0 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
2aa00 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
2aa10 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
2aa20 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
2aa30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2aa40 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
2aa50 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
2aa60 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66  [] */.  int iOvf
2aa70 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  lSpace = 0;     
2aa80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
2aa90 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76  used byte of aOv
2aaa0 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69  flSpace[] */.  i
2aab0 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2aad0 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
2aae0 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
2aaf0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
2ab00 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
2ab10 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
2ab20 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
2ab30 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
2ab40 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
2ab50 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2ab60 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
2ab70 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  e in apOld[] */.
2ab80 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70    MemPage *apCop
2ab90 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
2aba0 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73  * Private copies
2abb0 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65   of apOld[] page
2abc0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
2abd0 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  apNew[NB+2];    
2abe0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
2abf0 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e   up to NB siblin
2ac00 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  gs after balanci
2ac10 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ng */.  Pgno pgn
2ac20 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  oNew[NB+2];     
2ac30 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2ac40 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
2ac50 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  ge in apNew[] */
2ac60 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d  .  u8 *apDiv[NB]
2ac70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ac80 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
2ac90 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
2aca0 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
2acb0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
2acc0 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
2acd0 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
2ace0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
2acf0 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2ad10 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
2ad20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
2ad30 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
2ad40 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
2ad50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2ad60 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
2ad70 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
2ad80 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
2ad90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2ada0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
2adb0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2adc0 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e  */.  u8 *aCopy[N
2add0 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  B];         /* S
2ade0 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67  pace for holding
2adf0 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b   data of apCopy[
2ae00 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
2ae10 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e1;           /*
2ae20 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65   Space for copie
2ae30 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
2ae40 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61 6e  lls before balan
2ae50 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f  ce */.  u8 *aFro
2ae60 6d 20 3d 20 30 3b 0a 0a 20 20 70 42 74 20 3d 20  m = 0;..  pBt = 
2ae70 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20  pParent->pBt;.  
2ae80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2ae90 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2aea0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2aeb0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2aec0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
2aed0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
2aee0 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
2aef0 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20  NCE: begin page 
2af00 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e  %d child of %d\n
2af10 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
2af20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b  pParent->pgno));
2af30 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
2af40 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f  sibling pages to
2af50 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c   balance. Also l
2af60 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ocate the cells 
2af70 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a  in pParent .  **
2af80 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65   that divide the
2af90 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74   siblings. An at
2afa0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2afb0 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
2afc0 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65  s on .  ** eithe
2afd0 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  r side of pPage.
2afe0 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
2aff0 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
2b000 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
2b010 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20   .  ** if there 
2b020 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e  are fewer than N
2b030 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68  N siblings on th
2b040 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66  e other side. If
2b050 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
2b060 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
2b070 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
2b080 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
2b090 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20  ent are taken.. 
2b0a0 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 50   */.  nxDiv = iP
2b0b0 61 72 65 6e 74 49 64 78 20 2d 20 4e 4e 3b 0a 20  arentIdx - NN;. 
2b0c0 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20   if( nxDiv + NB 
2b0d0 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  > pParent->nCell
2b0e0 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
2b0f0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d  pParent->nCell -
2b100 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69   NB + 1;.  }.  i
2b110 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20  f( nxDiv<0 ){.  
2b120 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
2b130 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78  .  for(i=0, k=nx
2b140 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20  Div; i<NB; i++, 
2b150 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c  k++){.    if( k<
2b160 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2b170 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
2b180 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
2b190 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 61  ent, k);.      a
2b1a0 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d  ssert( !pParent-
2b1b0 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70  >leaf );.      p
2b1c0 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
2b1d0 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
2b1e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d      }else if( k=
2b1f0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
2b200 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  ){.      pgnoOld
2b210 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26  [i] = get4byte(&
2b220 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2b230 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2b240 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
2b250 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
2b260 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
2b270 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
2b280 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61  , pgnoOld[i], &a
2b290 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
2b2a0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2b2b0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2b2c0 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a   apCopy[i] = 0;.
2b2d0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
2b2e0 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b  Old );.    nOld+
2b2f0 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73  +;.    nMaxCells
2b300 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
2b310 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
2b320 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a  nOverflow;.  }..
2b330 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
2b340 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
2b350 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
2b360 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
2b370 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
2b380 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
2b390 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
2b3a0 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
2b3b0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
2b3c0 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
2b3d0 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72  res.  */.  szScr
2b3e0 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d  atch =.       nM
2b3f0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2b400 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
2b410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
2b420 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
2b430 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2b440 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
2b450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
2b460 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52  ell */.     + (R
2b470 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
2b480 50 61 67 65 29 29 2b 70 42 74 2d 3e 70 61 67 65  Page))+pBt->page
2b490 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f  Size)*NB  /* aCo
2b4a0 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  py */.     + pBt
2b4b0 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
2b4e0 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49  ce1 */.     + (I
2b4f0 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d  SAUTOVACUUM ? nM
2b500 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20  axCells : 0);   
2b510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72            /* aFr
2b520 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  om */.  apCell =
2b530 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
2b540 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68  alloc( szScratch
2b550 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c   ); .  if( apCel
2b560 6c 3d 3d 30 20 7c 7c 20 61 4f 76 66 6c 53 70 61  l==0 || aOvflSpa
2b570 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ce==0 ){.    rc 
2b580 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2b590 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2b5a0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
2b5b0 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
2b5c0 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
2b5d0 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20  ];.  aCopy[0] = 
2b5e0 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
2b5f0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
2b600 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2b610 49 47 4e 4d 45 4e 54 28 61 43 6f 70 79 5b 30 5d  IGNMENT(aCopy[0]
2b620 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ) );.  for(i=1; 
2b630 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<NB; i++){.    
2b640 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70  aCopy[i] = &aCop
2b650 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  y[i-1][pBt->page
2b660 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
2b670 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
2b680 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f     assert( ((aCo
2b690 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 30 29 20  py[i] - (u8*)0) 
2b6a0 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
2b6b0 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
2b6c0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20  equired */.  }. 
2b6d0 20 61 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70   aSpace1 = &aCop
2b6e0 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  y[NB-1][pBt->pag
2b6f0 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
2b700 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
2b710 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2b720 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61  BYTE_ALIGNMENT(a
2b730 53 70 61 63 65 31 29 20 29 3b 0a 20 20 69 66 28  Space1) );.  if(
2b740 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2b750 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53  .    aFrom = &aS
2b760 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
2b770 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  ize];.  }.  .  /
2b780 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69  *.  ** Make copi
2b790 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  es of the conten
2b7a0 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69  t of pPage and i
2b7b0 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f  ts siblings into
2b7c0 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68   aOld[]..  ** Th
2b7d0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
2b7e0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
2b7f0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
2b800 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a  opies rather.  *
2b810 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
2b820 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
2b830 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2b840 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
2b850 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f  e.  ** process o
2b860 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
2b870 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ten..  */.  for(
2b880 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
2b890 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
2b8a0 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20  p = apCopy[i] = 
2b8b0 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b  (MemPage*)aCopy[
2b8c0 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i];.    memcpy(p
2b8d0 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
2b8e0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
2b8f0 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f    p->aData = (vo
2b900 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d  id*)&p[1];.    m
2b910 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20  emcpy(p->aData, 
2b920 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
2b930 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
2b940 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2b950 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
2b960 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
2b970 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
2b980 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2b990 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
2b9a0 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
2b9b0 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
2b9c0 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
2b9d0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
2b9e0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
2b9f0 20 66 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20   form aSpace1[] 
2ba00 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
2ba10 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
2ba20 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
2ba30 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
2ba40 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2ba50 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
2ba60 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
2ba70 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
2ba80 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
2ba90 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
2baa0 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
2bab0 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
2bac0 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
2bad0 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
2bae0 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
2baf0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
2bb00 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
2bb10 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
2bb20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
2bb30 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
2bb40 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
2bb50 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
2bb60 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
2bb70 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
2bb80 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2bb90 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
2bba0 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
2bbb0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
2bbc0 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
2bbd0 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
2bbe0 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
2bbf0 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
2bc00 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
2bc10 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
2bc20 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
2bc30 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
2bc40 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30    */.  nCell = 0
2bc50 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ;.  leafCorrecti
2bc60 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c  on = apOld[0]->l
2bc70 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74  eaf*4;.  leafDat
2bc80 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61  a = apOld[0]->ha
2bc90 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30  sData;.  for(i=0
2bca0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
2bcb0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
2bcc0 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
2bcd0 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
2bce0 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
2bcf0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
2bd00 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
2bd10 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
2bd20 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
2bd30 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
2bd40 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
2bd50 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2bd60 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
2bd70 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
2bd80 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
2bd90 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
2bda0 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  ;.      if( ISAU
2bdb0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2bdc0 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20      int a;.     
2bdd0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
2bde0 3d 20 28 75 38 29 69 3b 20 20 20 61 73 73 65 72  = (u8)i;   asser
2bdf0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 36 20 29  t( i>=0 && i<6 )
2be00 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d  ;.        for(a=
2be10 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72  0; a<pOld->nOver
2be20 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20  flow; a++){.    
2be30 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
2be40 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d  aOvfl[a].pCell==
2be50 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b  apCell[nCell] ){
2be60 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72  .            aFr
2be70 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
2be80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2be90 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2bea0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2beb0 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b   }.      nCell++
2bec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2bed0 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20  i<nOld-1 ){.    
2bee0 20 20 75 31 36 20 73 7a 20 3d 20 63 65 6c 6c 53    u16 sz = cellS
2bef0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2bf00 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2bf10 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
2bf20 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68  .        /* With
2bf30 20 74 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c   the LEAFDATA fl
2bf40 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c  ag, pParent cell
2bf50 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b  s hold only INTK
2bf60 45 59 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  EYs that.       
2bf70 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74   ** are duplicat
2bf80 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68  es of keys on th
2bf90 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20  e child pages.  
2bfa0 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76  We need to remov
2bfb0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
2bfc0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
2bfd0 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74  rom pParent, but
2bfe0 20 74 68 65 20 64 69 76 69 64 65 72 73 20 63 65   the dividers ce
2bff0 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20  lls are not.    
2c000 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
2c010 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65  apCell[] because
2c020 20 74 68 65 79 20 61 72 65 20 64 75 70 6c 69 63   they are duplic
2c030 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65  ates of child ce
2c040 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lls..        */.
2c050 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
2c060 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2c070 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   sz);.      }els
2c080 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  e{.        u8 *p
2c090 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  Temp;.        as
2c0a0 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
2c0b0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
2c0c0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2c0d0 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65   sz;.        pTe
2c0e0 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53  mp = &aSpace1[iS
2c0f0 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 20 20  pace1];.        
2c100 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
2c110 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2c120 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
2c130 2f 34 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  /4 );.        as
2c140 73 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70  sert( iSpace1<=p
2c150 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
2c160 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
2c170 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Temp, apDiv[i], 
2c180 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  sz);.        apC
2c190 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
2c1a0 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
2c1b0 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  n;.        if( I
2c1c0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2c1d0 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e           aFrom[n
2c1e0 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20  Cell] = 0xFF;.  
2c1f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c200 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
2c210 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
2c220 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2c230 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2c240 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  || leafCorrectio
2c250 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
2c260 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d  szCell[nCell] -=
2c270 20 28 75 31 36 29 6c 65 61 66 43 6f 72 72 65 63   (u16)leafCorrec
2c280 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  tion;.        as
2c290 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 70  sert( get4byte(p
2c2a0 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69  Temp)==pgnoOld[i
2c2b0 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ] );.        if(
2c2c0 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
2c2d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c2e0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2c2f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2c300 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
2c310 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
2c320 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
2c330 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
2c340 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
2c350 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
2c360 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
2c370 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
2c380 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
2c390 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72  >aData[pOld->hdr
2c3a0 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20  Offset+8], 4);. 
2c3b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c3c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c3d0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2c3e0 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  4 );.          i
2c3f0 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  f( szCell[nCell]
2c400 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
2c410 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
2c420 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
2c430 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
2c440 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
2c450 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2c460 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
2c470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c480 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
2c490 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2c4a0 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
2c4b0 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
2c4c0 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
2c4d0 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
2c4e0 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
2c4f0 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
2c500 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
2c510 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
2c520 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
2c530 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
2c540 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
2c550 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
2c560 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
2c570 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
2c580 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
2c590 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
2c5a0 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
2c5b0 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
2c5c0 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
2c5d0 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
2c5e0 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
2c5f0 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
2c600 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
2c610 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
2c620 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2c630 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
2c640 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
2c650 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
2c660 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
2c670 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
2c680 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
2c690 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
2c6a0 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
2c6b0 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
2c6c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
2c6d0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
2c6e0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
2c6f0 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
2c700 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
2c710 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
2c720 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
2c730 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
2c740 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
2c750 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
2c760 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
2c770 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
2c780 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
2c790 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
2c7a0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
2c7b0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
2c7c0 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
2c7d0 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
2c7e0 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
2c7f0 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
2c800 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
2c810 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
2c820 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
2c830 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
2c840 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
2c850 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
2c860 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
2c870 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e  ++;.      if( k>
2c880 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c  NB+1 ){ rc = SQL
2c890 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 67 6f 74  ITE_CORRUPT; got
2c8a0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2c8b0 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p; }.    }.  }. 
2c8c0 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
2c8d0 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
2c8e0 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
2c8f0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
2c900 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
2c910 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
2c920 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
2c930 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
2c940 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
2c950 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
2c960 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
2c970 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
2c980 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
2c990 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
2c9a0 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
2c9b0 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
2c9c0 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
2c9d0 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
2c9e0 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
2c9f0 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
2ca00 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
2ca10 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
2ca20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
2ca30 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
2ca40 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
2ca50 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
2ca60 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
2ca70 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
2ca80 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
2ca90 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
2caa0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
2cab0 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
2cac0 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
2cad0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
2cae0 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
2caf0 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
2cb00 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
2cb10 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
2cb20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
2cb30 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
2cb40 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
2cb50 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
2cb60 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
2cb70 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
2cb80 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
2cb90 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
2cba0 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
2cbb0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2cbc0 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
2cbd0 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
2cbe0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cc00 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
2cc10 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
2cc20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
2cc30 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
2cc40 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
2cc50 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
2cc60 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
2cc70 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
2cc80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
2cc90 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2cca0 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
2ccb0 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73  ==0 || szRight+s
2ccc0 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
2ccd0 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
2cce0 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
2ccf0 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
2cd00 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
2cd10 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
2cd20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
2cd30 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
2cd40 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
2cd50 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
2cd60 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
2cd70 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
2cd80 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
2cd90 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
2cda0 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
2cdb0 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
2cdc0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
2cdd0 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
2cde0 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a   or pPage is.  *
2cdf0 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
2ce00 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
2ce10 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
2ce20 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
2ce30 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
2ce40 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
2ce50 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
2ce60 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
2ce70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  */.  assert( cnt
2ce80 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
2ce90 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
2cea0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
2ceb0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  =0) );..  /*.  *
2cec0 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
2ced0 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
2cee0 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
2cef0 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
2cf00 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67  if( apOld[0]->pg
2cf10 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20  no<=1 ){.    rc 
2cf20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2cf30 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
2cf40 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2cf50 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70    pageFlags = ap
2cf60 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d  Old[0]->aData[0]
2cf70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
2cf80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
2cf90 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
2cfa0 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
2cfb0 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
2cfc0 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
2cfd0 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
2cfe0 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20  = pgnoOld[i];.  
2cff0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
2d000 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2d010 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2d020 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  New->pDbPage);. 
2d030 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
2d040 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2d050 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2d060 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d070 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
2d080 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  ;.      rc = all
2d090 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2d0a0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
2d0b0 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b  New[i], pgnoNew[
2d0c0 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  i-1], 0);.      
2d0d0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2d0e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2d0f0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
2d100 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
2d110 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
2d120 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
2d130 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
2d140 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
2d150 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
2d160 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
2d170 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
2d180 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2d190 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2d1a0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2d1b0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
2d1c0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
2d1d0 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
2d1e0 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
2d1f0 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
2d200 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
2d210 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
2d220 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
2d230 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
2d240 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
2d250 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
2d260 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
2d270 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
2d280 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
2d290 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
2d2a0 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
2d2b0 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
2d2c0 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
2d2d0 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
2d2e0 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
2d2f0 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
2d300 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
2d310 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
2d320 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
2d330 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
2d340 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
2d350 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
2d360 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
2d370 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
2d380 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
2d390 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
2d3a0 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
2d3b0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
2d3c0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
2d3d0 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
2d3e0 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
2d3f0 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
2d400 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
2d410 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
2d420 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
2d430 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b  nV = pgnoNew[i];
2d440 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20  .    int minI = 
2d450 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  i;.    for(j=i+1
2d460 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<k; j++){.   
2d470 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a     if( pgnoNew[j
2d480 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56  ]<(unsigned)minV
2d490 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49   ){.        minI
2d4a0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69   = j;.        mi
2d4b0 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b  nV = pgnoNew[j];
2d4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d4d0 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
2d4e0 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20  .      int t;.  
2d4f0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
2d500 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e  .      t = pgnoN
2d510 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20  ew[i];.      pT 
2d520 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
2d530 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
2d540 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20  gnoNew[minI];.  
2d550 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61      apNew[i] = a
2d560 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  pNew[minI];.    
2d570 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20    pgnoNew[minI] 
2d580 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  = t;.      apNew
2d590 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20  [minI] = pT;.   
2d5a0 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28   }.  }.  TRACE((
2d5b0 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25  "BALANCE: old: %
2d5c0 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64  d %d %d  new: %d
2d5d0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
2d5e0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
2d5f0 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64  \n",.    pgnoOld
2d600 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  [0], .    nOld>=
2d610 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a  2 ? pgnoOld[1] :
2d620 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20   0,.    nOld>=3 
2d630 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30  ? pgnoOld[2] : 0
2d640 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d  ,.    pgnoNew[0]
2d650 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20  , szNew[0],.    
2d660 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65  nNew>=2 ? pgnoNe
2d670 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[1] : 0, nNew>=
2d680 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30  2 ? szNew[1] : 0
2d690 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20  ,.    nNew>=3 ? 
2d6a0 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20  pgnoNew[2] : 0, 
2d6b0 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
2d6c0 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
2d6d0 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d  >=4 ? pgnoNew[3]
2d6e0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
2d6f0 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
2d700 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f    nNew>=5 ? pgno
2d710 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[4] : 0, nNew
2d720 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a  >=5 ? szNew[4] :
2d730 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   0));..  /*.  **
2d740 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75   Evenly distribu
2d750 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61  te the data in a
2d760 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74  pCell[] across t
2d770 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  he new pages..  
2d780 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65  ** Insert divide
2d790 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61  r cells into pPa
2d7a0 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72  rent as necessar
2d7b0 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b  y..  */.  j = 0;
2d7c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
2d7d0 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ew; i++){.    /*
2d7e0 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65   Assemble the ne
2d7f0 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
2d800 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
2d810 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b  pNew = apNew[i];
2d820 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e  .    assert( j<n
2d830 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2d840 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67  assert( pNew->pg
2d850 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29  no==pgnoNew[i] )
2d860 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
2d870 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
2d880 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
2d890 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
2d8a0 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
2d8b0 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
2d8c0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2d8d0 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
2d8e0 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
2d8f0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
2d900 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
2d910 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  low==0 );..    /
2d920 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2d930 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
2d940 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
2d950 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
2d960 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  ries.    ** that
2d970 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69   point to the si
2d980 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
2d990 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65   rearranged. The
2d9a0 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a  se can be: left.
2d9b0 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20      ** children 
2d9c0 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69  of cells, the ri
2d9d0 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65  ght-child of the
2d9e0 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c   page, or overfl
2d9f0 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20  ow pages.    ** 
2da00 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65  pointed to by ce
2da10 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lls..    */.    
2da20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2da30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   ){.      for(k=
2da40 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20  j; k<cntNew[i]; 
2da50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  k++){.        as
2da60 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c  sert( k<nMaxCell
2da70 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s );.        if(
2da80 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20   aFrom[k]==0xFF 
2da90 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
2daa0 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  k]]->pgno!=pNew-
2dab0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
2dac0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2dad0 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29  tOvfl(pNew, k-j)
2dae0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2daf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2db00 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2db10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2db20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2db30 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61  (pBt, get4byte(a
2db40 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41  pCell[k]), PTRMA
2db50 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
2db60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
2db70 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2db80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2db90 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2dba0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2dbb0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
2dbc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2dbd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20  .    }..    j = 
2dbe0 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
2dbf0 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
2dc00 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
2dc10 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
2dc20 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
2dc30 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
2dc40 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
2dc50 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
2dc60 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
2dc70 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d  .    if( i<nNew-
2dc80 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a  1 && j<nCell ){.
2dc90 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
2dca0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
2dcb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
2dcc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
2dcd0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2dce0 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
2dcf0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
2dd00 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
2dd10 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2dd20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76      pTemp = &aOv
2dd30 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61  flSpace[iOvflSpa
2dd40 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ce];.      if( !
2dd50 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
2dd60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2dd70 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
2dd80 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ell, 4);.       
2dd90 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2dda0 4d 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  M .         && (
2ddb0 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c  aFrom[j]==0xFF |
2ddc0 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a  | apCopy[aFrom[j
2ddd0 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ]]->pgno!=pNew->
2dde0 70 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 7b  pgno).        ){
2ddf0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2de00 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
2de10 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
2de20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e  PTRMAP_BTREE, pN
2de30 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ew->pgno);.     
2de40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2de50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2de60 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2de70 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2de80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2de90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2dea0 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
2deb0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2dec0 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
2ded0 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
2dee0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
2def0 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
2df00 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
2df10 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
2df20 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
2df30 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
2df40 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
2df50 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
2df60 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
2df70 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
2df80 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
2df90 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
2dfa0 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
2dfb0 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
2dfc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2dfd0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2dfe0 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
2dff0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2e000 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
2e010 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
2e020 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
2e030 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 09 73  Cell = pTemp;..s
2e040 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
2e050 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
2e060 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
2e070 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
2e080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e090 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
2e0a0 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
2e0b0 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
2e0c0 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
2e0d0 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
2e0e0 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
2e0f0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
2e100 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
2e110 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
2e120 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
2e130 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
2e140 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
2e150 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
2e160 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
2e170 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c       ** (see sql
2e180 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
2e190 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
2e1a0 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
2e1b0 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
2e1c0 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
2e1d0 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
2e1e0 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
2e1f0 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
2e200 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
2e210 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
2e220 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
2e230 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e240 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
2e250 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
2e260 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
2e270 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
2e280 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
2e290 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
2e2a0 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
2e2b0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
2e2c0 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
2e2d0 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
2e2e0 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
2e2f0 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
2e300 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
2e310 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2e320 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
2e330 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2e340 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
2e350 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
2e360 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
2e370 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
2e380 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e390 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c     }.      iOvfl
2e3a0 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
2e3b0 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
2e3c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
2e3d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e3e0 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42 74 2d  iOvflSpace<=pBt-
2e3f0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
2e400 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
2e410 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
2e420 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
2e430 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  emp, 4);.      i
2e440 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e450 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
2e460 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
2e470 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2e480 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2e490 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2e4a0 20 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79   );.      put4by
2e4b0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
2e4c0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69  ell(pParent,nxDi
2e4d0 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  v), pNew->pgno);
2e4e0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2e4f0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2e500 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61  cuum database, a
2e510 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61  nd not a leaf-da
2e520 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a  ta tree,.      *
2e530 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20 74 68  * then update th
2e540 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69  e pointer map wi
2e550 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  th an entry for 
2e560 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
2e570 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  e.      ** that 
2e580 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e  the cell just in
2e590 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f  serted points to
2e5a0 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20   (if any)..     
2e5b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53   */.      if( IS
2e5c0 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c  AUTOVACUUM && !l
2e5d0 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
2e5e0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2e5f0 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tOvfl(pParent, n
2e600 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69  xDiv);.        i
2e610 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2e630 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2e640 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  up;.        }.  
2e650 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b      }.      j++;
2e660 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
2e670 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
2e680 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
2e690 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
2e6a0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
2e6b0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41  . */.    if( ISA
2e6c0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2e6d0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2e6e0 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e  t(pBt, pNew->pgn
2e6f0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
2e700 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
2e710 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2e720 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e730 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2e740 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2e750 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
2e760 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29  sert( j==nCell )
2e770 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64  ;.  assert( nOld
2e780 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2e790 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20  nNew>0 );.  if( 
2e7a0 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46  (pageFlags & PTF
2e7b0 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEAF)==0 ){.   
2e7c0 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61   u8 *zChild = &a
2e7d0 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61  pCopy[nOld-1]->a
2e7e0 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d  Data[8];.    mem
2e7f0 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d  cpy(&apNew[nNew-
2e800 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43  1]->aData[8], zC
2e810 68 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66  hild, 4);.    if
2e820 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2e830 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
2e840 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34  mapPut(pBt, get4
2e850 62 79 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54  byte(zChild), PT
2e860 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65  RMAP_BTREE, apNe
2e870 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
2e880 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2e890 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e8a0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2e8b0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2e8c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
2e8d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2e8e0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2e8f0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2e900 20 29 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 3d   );.  if( nxDiv=
2e910 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b  =pParent->nCell+
2e920 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2e930 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67  ow ){.    /* Rig
2e940 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
2e950 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
2e960 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
2e970 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  nt */.    put4by
2e980 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
2e990 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
2e9a0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
2e9b0 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65  w[nNew-1]);.  }e
2e9c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  lse{.    /* Righ
2e9d0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
2e9e0 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64  s the left child
2e9f0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e   of the first en
2ea00 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20  try in pParent. 
2ea10 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72     ** past the r
2ea20 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65  ight-most divide
2ea30 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70  r entry */.    p
2ea40 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
2ea50 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
2ea60 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65  , nxDiv), pgnoNe
2ea70 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a  w[nNew-1]);.  }.
2ea80 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e  .  /*.  ** Balan
2ea90 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
2eaa0 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  ge.  Note that t
2eab0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2eac0 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20  (pPage) might.  
2ead0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64 64  ** have been add
2eae0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
2eaf0 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  st so it might n
2eb00 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74  o longer be init
2eb10 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75  ialized..  ** Bu
2eb20 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2eb30 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  e will always be
2eb40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
2eb50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
2eb60 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  rent->isInit );.
2eb70 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68    sqlite3Scratch
2eb80 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  Free(apCell);.  
2eb90 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 54 52  apCell = 0;.  TR
2eba0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66  ACE(("BALANCE: f
2ebb0 69 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a  inished with %d:
2ebc0 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63   old=%d new=%d c
2ebd0 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  ells=%d\n",.    
2ebe0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
2ebf0 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e  o, nOld, nNew, n
2ec00 43 65 6c 6c 29 29 3b 0a 20 20 0a 20 20 2f 2a 0a  Cell));.  .  /*.
2ec10 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66    ** Cleanup bef
2ec20 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20  ore returning.. 
2ec30 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61   */.balance_clea
2ec40 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63  nup:.  sqlite3Sc
2ec50 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
2ec60 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2ec70 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
2ec80 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
2ec90 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
2eca0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
2ecb0 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
2ecc0 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
2ecd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2ece0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2ecf0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2ed00 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  to copy the cont
2ed10 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72  ents of the b-tr
2ed20 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a  ee node stored .
2ed30 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d  ** on page pFrom
2ed40 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66   to page pTo. If
2ed50 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20   page pFrom was 
2ed60 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
2ed70 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69   then.** the poi
2ed80 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2ed90 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20   for each child 
2eda0 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64  page are updated
2edb0 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
2edc0 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72  parent page stor
2edd0 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ed in the pointe
2ede0 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54  r map is page pT
2edf0 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74  o. If pFrom cont
2ee00 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c  ained.** any cel
2ee10 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  ls with overflow
2ee20 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20   page pointers, 
2ee30 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70  then the corresp
2ee40 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a  onding pointer.*
2ee50 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72  * map entries ar
2ee60 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73  e also updated s
2ee70 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e  o that the paren
2ee80 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70  t page is page p
2ee90 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  To..**.** If pFr
2eea0 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  om is currently 
2eeb0 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65  carrying any ove
2eec0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74  rflow cells (ent
2eed0 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d  ries in the.** M
2eee0 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61  emPage.aOvfl[] a
2eef0 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20  rray), they are 
2ef00 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54  not copied to pT
2ef10 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  o. .**.** Before
2ef20 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65   returning, page
2ef30 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61   pTo is reinitia
2ef40 6c 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69  lized using sqli
2ef50 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
2ef60 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65  ()..**.** The pe
2ef70 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69  rformance of thi
2ef80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
2ef90 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69  t critical. It i
2efa0 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a  s only used by .
2efb0 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73  ** the balance_s
2efc0 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62  hallower() and b
2efd0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
2efe0 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74  procedures, neit
2eff0 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20  her of.** which 
2f000 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e  are called often
2f010 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69   under normal ci
2f020 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a  rcumstances..*/.
2f030 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 4e  static int copyN
2f040 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61  odeContent(MemPa
2f050 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61  ge *pFrom, MemPa
2f060 67 65 20 2a 70 54 6f 29 7b 0a 20 20 42 74 53 68  ge *pTo){.  BtSh
2f070 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74  ared * const pBt
2f080 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20   = pFrom->pBt;. 
2f090 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f   u8 * const aFro
2f0a0 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61  m = pFrom->aData
2f0b0 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  ;.  u8 * const a
2f0c0 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b  To = pTo->aData;
2f0d0 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72  .  int const iFr
2f0e0 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68  omHdr = pFrom->h
2f0f0 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20  drOffset;.  int 
2f100 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28  const iToHdr = (
2f110 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f  (pTo->pgno==1) ?
2f120 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 69 6e 74   100 : 0);.  int
2f130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f140 0a 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20  .  int iData;.. 
2f150 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2f160 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
2f170 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65  rt( pFrom->nFree
2f180 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 61 73  >=iToHdr );.  as
2f190 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26  sert( get2byte(&
2f1a0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
2f1b0 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ])<=pBt->usableS
2f1c0 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70  ize );..  /* Cop
2f1d0 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  y the b-tree nod
2f1e0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  e content from p
2f1f0 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
2f200 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 69 44 61 74  e pTo. */.  iDat
2f210 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 46  a = get2byte(&aF
2f220 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
2f230 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b  ;.  memcpy(&aTo[
2f240 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69  iData], &aFrom[i
2f250 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62  Data], pBt->usab
2f260 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20  leSize-iData);. 
2f270 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f   memcpy(&aTo[iTo
2f280 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72  Hdr], &aFrom[iFr
2f290 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63  omHdr], pFrom->c
2f2a0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46  ellOffset + 2*pF
2f2b0 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 20 20  rom->nCell);..  
2f2c0 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
2f2d0 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
2f2e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2f2f0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
2f300 75 63 74 75 72 65 0a 20 20 2a 2a 20 6d 61 74 63  ucture.  ** matc
2f310 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
2f320 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
2f330 6f 6e 20 6f 66 20 70 54 6f 20 22 63 61 6e 6e 6f  on of pTo "canno
2f340 74 22 20 66 61 69 6c 2c 20 61 73 20 74 68 65 0a  t" fail, as the.
2f350 20 20 2a 2a 20 64 61 74 61 20 63 6f 70 69 65 64    ** data copied
2f360 20 66 72 6f 6d 20 70 46 72 6f 6d 20 69 73 20 6b   from pFrom is k
2f370 6e 6f 77 6e 20 74 6f 20 62 65 20 76 61 6c 69 64  nown to be valid
2f380 2e 20 20 2a 2f 0a 20 20 70 54 6f 2d 3e 69 73 49  .  */.  pTo->isI
2f390 6e 69 74 20 3d 20 30 3b 0a 20 20 54 45 53 54 4f  nit = 0;.  TESTO
2f3a0 4e 4c 59 28 72 63 20 3d 20 29 20 73 71 6c 69 74  NLY(rc = ) sqlit
2f3b0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2f3c0 70 54 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  pTo);.  assert( 
2f3d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2f3e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
2f3f0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
2f400 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
2f410 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  e the pointer-ma
2f420 70 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 66  p entries.  ** f
2f430 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72  or any b-tree or
2f440 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2f450 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e  that pTo now con
2f460 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
2f470 72 73 20 74 6f 2e 20 2a 2f 0a 20 20 69 66 28 20  rs to. */.  if( 
2f480 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2f490 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
2f4a0 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20  dPtrmaps(pTo);. 
2f4b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2f4c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2f4d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2f4e0 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  on the root page
2f4f0 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e   of a btree when
2f500 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2f510 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
2f520 6c 6c 73 2e 20 54 68 69 73 20 69 73 20 61 6e 20  lls. This is an 
2f530 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d  opportunity to m
2f540 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20  ake the tree.** 
2f550 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65  shallower by one
2f560 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
2f570 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68  c int balance_sh
2f580 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20  allower(MemPage 
2f590 2a 70 52 6f 6f 74 29 7b 0a 20 20 2f 2a 20 54 68  *pRoot){.  /* Th
2f5a0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
2f5b0 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65  mpty but has one
2f5c0 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65   child.  Transfe
2f5d0 72 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  r the.  ** infor
2f5e0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74  mation from that
2f5f0 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20   one child into 
2f600 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66  the root page if
2f610 20 69 74 20 0a 20 20 2a 2a 20 77 69 6c 6c 20 66   it .  ** will f
2f620 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65  it.  This reduce
2f630 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  s the depth of t
2f640 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a  he tree by one..
2f650 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
2f660 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70 61   root page is pa
2f670 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65 73  ge 1, it has les
2f680 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  s space availabl
2f690 65 20 74 68 61 6e 0a 20 20 2a 2a 20 69 74 73 20  e than.  ** its 
2f6a0 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68  child (due to th
2f6b0 65 20 31 30 30 20 62 79 74 65 20 68 65 61 64 65  e 100 byte heade
2f6c0 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  r that occurs at
2f6d0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
2f6e0 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
2f6f0 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20  ase fle), so it 
2f700 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c  might not be abl
2f710 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66  e to hold all of
2f720 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 66 6f 72   the .  ** infor
2f730 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  mation currently
2f740 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2f750 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69  e child.  If thi
2f760 73 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 63  s is the .  ** c
2f770 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ase, then do not
2f780 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72   do the transfer
2f790 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20  .  Leave page 1 
2f7a0 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 2a  empty except.  *
2f7b0 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  * for the right-
2f7c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
2f7d0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2f7e0 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d  child page becom
2f7f0 65 73 0a 20 20 2a 2a 20 74 68 65 20 76 69 72 74  es.  ** the virt
2f800 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  ual root of the 
2f810 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  tree..  */.  int
2f820 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f840 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2f850 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2f860 63 6f 6e 73 74 20 68 64 72 20 3d 20 70 52 6f 6f  const hdr = pRoo
2f870 74 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  t->hdrOffset;   
2f880 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2f890 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 20 68 65   of root page he
2f8a0 61 64 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ader */.  MemPag
2f8b0 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20  e *pChild;      
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8d0 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 69       /* Only chi
2f8e0 6c 64 20 6f 66 20 70 52 6f 6f 74 20 2a 2f 0a 20  ld of pRoot */. 
2f8f0 20 50 67 6e 6f 20 63 6f 6e 73 74 20 70 67 6e 6f   Pgno const pgno
2f900 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
2f910 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
2f920 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
2f930 38 5d 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  8]);.  .  assert
2f940 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
2f950 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
2f960 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2f970 64 28 70 52 6f 6f 74 2d 3e 70 42 74 2d 3e 6d 75  d(pRoot->pBt->mu
2f980 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2f990 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  ( !pRoot->leaf )
2f9a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
2f9b0 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Child>0 );.  ass
2f9c0 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d  ert( pgnoChild<=
2f9d0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2f9e0 52 6f 6f 74 2d 3e 70 42 74 29 20 29 3b 0a 20 20  Root->pBt) );.  
2f9f0 61 73 73 65 72 74 28 20 68 64 72 3d 3d 30 20 7c  assert( hdr==0 |
2fa00 7c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31  | pRoot->pgno==1
2fa10 20 29 3b 0a 20 20 0a 20 20 72 63 20 3d 20 73 71   );.  .  rc = sq
2fa20 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2fa30 65 28 70 52 6f 6f 74 2d 3e 70 42 74 2c 20 70 67  e(pRoot->pBt, pg
2fa40 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64  noChild, &pChild
2fa50 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
2fa60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fa70 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
2fa80 65 65 3e 3d 68 64 72 20 29 7b 0a 20 20 20 20 20  ee>=hdr ){.     
2fa90 20 69 66 28 20 68 64 72 20 29 7b 0a 20 20 20 20   if( hdr ){.    
2faa0 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
2fab0 65 6e 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b  entPage(pChild);
2fac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2fad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fae0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2faf0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
2fb00 28 70 43 68 69 6c 64 2c 20 70 52 6f 6f 74 29 3b  (pChild, pRoot);
2fb10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2fb20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fb30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2fb40 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64   freePage(pChild
2fb50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2fb60 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
2fb70 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72  he child has mor
2fb80 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  e information th
2fb90 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  at will fit on t
2fba0 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 2a  he root..      *
2fbb0 2a 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c  * The tree is al
2fbc0 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20  ready balanced. 
2fbd0 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   Do nothing. */.
2fbe0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
2fbf0 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
2fc00 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
2fc10 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
2fc20 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  d->pgno));.    }
2fc30 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2fc40 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20  (pChild);.  }.. 
2fc50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2fc60 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2fc70 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
2fc80 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  en the root page
2fc90 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 72   of a b-tree str
2fca0 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65  ucture is.** ove
2fcb0 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f  rfull (has one o
2fcc0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
2fcd0 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20  pages)..**.** A 
2fce0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 69  new child page i
2fcf0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2fd00 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2fd10 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74  the current root
2fd20 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64  .** page, includ
2fd30 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ing overflow cel
2fd40 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69  ls, are copied i
2fd50 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54  nto the child. T
2fd60 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
2fd70 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74  is then overwrit
2fd80 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20 61  ten to make it a
2fd90 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74  n empty page wit
2fda0 68 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  h the right-chil
2fdb0 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f  d .** pointer po
2fdc0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
2fdd0 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  w page..**.** Be
2fde0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
2fdf0 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  all pointer-map 
2fe00 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f  entries correspo
2fe10 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 73 20 0a  nding to pages .
2fe20 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
2fe30 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63  child-page now c
2fe40 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
2fe50 20 74 6f 20 61 72 65 20 75 70 64 61 74 65 64 2e   to are updated.
2fe60 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f   The.** entry co
2fe70 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
2fe80 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
2fe90 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ld pointer of th
2fea0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
2feb0 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a  s also updated..
2fec0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2fed0 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73  ful, *ppChild is
2fee0 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20   set to contain 
2fef0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
2ff00 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67  he child .** pag
2ff10 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
2ff20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
2ff30 74 68 69 73 20 63 61 73 65 20 74 68 65 20 63 61  this case the ca
2ff40 6c 6c 65 72 20 69 73 20 72 65 71 75 69 72 65 64  ller is required
2ff50 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  .** to call rele
2ff60 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70  asePage() on *pp
2ff70 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e  Child exactly on
2ff80 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ce. If an error 
2ff90 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72  occurs,.** an er
2ffa0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2ffb0 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68 69 6c  rned and *ppChil
2ffc0 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
2ffd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2ffe0 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
2fff0 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50  age *pRoot, MemP
30000 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a  age **ppChild){.
30010 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
30020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30030 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
30040 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
30050 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
30060 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20   *pChild = 0;   
30070 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
30080 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
30090 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
300a0 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
300b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
300c0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
300d0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
300e0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
300f0 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b  Bt = pRoot->pBt;
30100 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
30110 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
30120 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Root->nOverflow>
30130 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
30140 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30150 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
30160 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f  ..  /* Make pRoo
30170 74 2c 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  t, the root page
30180 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20   of the b-tree, 
30190 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61  writable. Alloca
301a0 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70  te a new .  ** p
301b0 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
301c0 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 72 69 67  come the new rig
301d0 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 67  ht-child of pPag
301e0 65 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  e. Copy the cont
301f0 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
30200 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20   node stored on 
30210 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e  pRoot into the n
30220 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ew child page.. 
30230 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
30240 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
30250 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
30260 6f 74 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20  ot->pDbPage)).  
30270 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
30280 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
30290 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69  eePage(pBt,&pChi
302a0 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52  ld,&pgnoChild,pR
302b0 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 29 0a 20 20  oot->pgno,0)).  
302c0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
302d0 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  rc = copyNodeCon
302e0 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69  tent(pRoot, pChi
302f0 6c 64 29 29 0a 20 20 20 7c 7c 20 28 49 53 41 55  ld)).   || (ISAU
30300 54 4f 56 41 43 55 55 4d 20 26 26 20 0a 20 20 20  TOVACUUM && .   
30310 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
30320 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
30330 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50  Bt, pgnoChild, P
30340 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f  TRMAP_BTREE, pRo
30350 6f 74 2d 3e 70 67 6e 6f 29 29 29 0a 20 20 29 7b  ot->pgno))).  ){
30360 0a 20 20 20 20 2a 70 70 43 68 69 6c 64 20 3d 20  .    *ppChild = 
30370 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  0;.    releasePa
30380 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
30390 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
303a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
303b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
303c0 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65  (pChild->pDbPage
303d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
303e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
303f0 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44  teable(pRoot->pD
30400 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
30410 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  rt( pChild->nCel
30420 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20  l==pRoot->nCell 
30430 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41  );..  TRACE(("BA
30440 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74  LANCE: copy root
30450 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20   %d into %d\n", 
30460 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68  pRoot->pgno, pCh
30470 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20  ild->pgno));..  
30480 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f 76 65 72  /* Copy the over
30490 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20  flow cells from 
304a0 70 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 20  pRoot to pChild 
304b0 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69  */.  memcpy(pChi
304c0 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74  ld->aOvfl, pRoot
304d0 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e  ->aOvfl, pRoot->
304e0 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
304f0 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d  (pRoot->aOvfl[0]
30500 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ));.  pChild->nO
30510 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d  verflow = pRoot-
30520 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f  >nOverflow;..  /
30530 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65  * Zero the conte
30540 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68  nts of pRoot. Th
30550 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c  en install pChil
30560 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 63  d as the right-c
30570 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50  hild. */.  zeroP
30580 61 67 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c  age(pRoot, pChil
30590 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50  d->aData[0] & ~P
305a0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34  TF_LEAF);.  put4
305b0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
305c0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
305d0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c  set+8], pgnoChil
305e0 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20  d);..  *ppChild 
305f0 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75  = pChild;.  retu
30600 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30610 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
30620 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65 6e  that pCur curren
30630 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  tly points to ha
30640 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69  s just been modi
30650 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20  fied in.** some 
30660 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69  way. This functi
30670 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20 69  on figures out i
30680 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74  f this modificat
30690 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ion means the.**
306a0 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62   tree needs to b
306b0 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20  e balanced, and 
306c0 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20  if so calls the 
306d0 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
306e0 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e  ncing .** routin
306f0 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75  e. Balancing rou
30700 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  tines are:.**.**
30710 20 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b     balance_quick
30720 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  ().**   balance_
30730 73 68 61 6c 6c 6f 77 65 72 28 29 0a 2a 2a 20 20  shallower().**  
30740 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
30750 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e  ).**   balance_n
30760 6f 6e 72 6f 6f 74 28 29 0a 2a 2a 0a 2a 2a 20 49  onroot().**.** I
30770 66 20 62 75 69 6c 74 20 77 69 74 68 20 53 51 4c  f built with SQL
30780 49 54 45 5f 44 45 42 55 47 2c 20 70 43 75 72 2d  ITE_DEBUG, pCur-
30790 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 69  >pagesShuffled i
307a0 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
307b0 20 0a 2a 2a 20 62 61 6c 61 6e 63 65 5f 73 68 61   .** balance_sha
307c0 6c 6c 6f 77 65 72 28 29 2c 20 62 61 6c 61 6e 63  llower(), balanc
307d0 65 5f 64 65 65 70 65 72 28 29 20 6f 72 20 62 61  e_deeper() or ba
307e0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
307f0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66  is called..** If
30800 20 6e 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 66   none of these f
30810 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 76  unctions are inv
30820 6f 6b 65 64 2c 20 70 43 75 72 2d 3e 70 61 67 65  oked, pCur->page
30830 73 53 68 75 66 66 6c 65 64 20 69 73 20 6c 65 66  sShuffled is lef
30840 74 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e  t.** unmodified.
30850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
30860 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20  alance(BtCursor 
30870 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
30880 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30890 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d  const int nMin =
308a0 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62   pCur->pBt->usab
308b0 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a  leSize * 2 / 3;.
308c0 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51 75 69    u8 aBalanceQui
308d0 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75  ckSpace[13];.  u
308e0 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20  8 *pFree = 0;.. 
308f0 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
30900 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c  alance_quick_cal
30910 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 54 45 53  led = 0 );.  TES
30920 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e  TONLY( int balan
30930 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64  ce_deeper_called
30940 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a   = 0 );..  do {.
30950 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
30960 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
30970 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
30980 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
30990 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20  Page];..    if( 
309a0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
309b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
309c0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
309d0 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
309e0 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
309f0 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e   is overfull. In
30a00 20 74 68 69 73 20 63 61 73 65 20 63 61 6c 6c 20   this case call 
30a10 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  the.        ** b
30a20 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
30a30 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65 61  function to crea
30a40 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 66  te a new child f
30a50 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
30a60 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
30a70 63 6f 70 79 20 74 68 65 20 63 75 72 72 65 6e 74  copy the current
30a80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
30a90 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 69 74   root-page to it
30aa0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
30ab0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
30ac0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
30ad0 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ill balance the 
30ae0 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20  child page..    
30af0 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20      */ .        
30b00 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65  assert( (balance
30b10 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b  _deeper_called++
30b20 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
30b30 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65  rc = balance_dee
30b40 70 65 72 28 70 50 61 67 65 2c 20 26 70 43 75 72  per(pPage, &pCur
30b50 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20  ->apPage[1]);.  
30b60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30b70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30b80 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65       pCur->iPage
30b90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
30ba0 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
30bb0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   0;.          pC
30bc0 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30  ur->aiIdx[1] = 0
30bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
30be0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
30bf0 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  [1]->nOverflow )
30c00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30c10 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43      VVA_ONLY( pC
30c20 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65  ur->pagesShuffle
30c30 64 20 3d 20 31 20 29 3b 0a 20 20 20 20 20 20 7d  d = 1 );.      }
30c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
30c50 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
30c60 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  f the b-tree is 
30c70 6e 6f 77 20 65 6d 70 74 79 2e 20 49 66 20 74 68  now empty. If th
30c80 65 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 6e  e root-page is n
30c90 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  ot.        ** al
30ca0 73 6f 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  so a leaf page, 
30cb0 69 74 20 77 69 6c 6c 20 68 61 76 65 20 61 20 73  it will have a s
30cc0 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
30cd0 2e 20 43 61 6c 6c 20 0a 20 20 20 20 20 20 20 20  . Call .        
30ce0 2a 2a 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c  ** balance_shall
30cf0 6f 77 65 72 20 74 6f 20 61 74 74 65 6d 70 74 20  ower to attempt 
30d00 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  to copy the cont
30d10 65 6e 74 73 20 6f 66 20 74 68 65 20 73 69 6e 67  ents of the sing
30d20 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 68  le.        ** ch
30d30 69 6c 64 2d 70 61 67 65 20 69 6e 74 6f 20 74 68  ild-page into th
30d40 65 20 72 6f 6f 74 20 70 61 67 65 20 28 74 68 69  e root page (thi
30d50 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  s may not be pos
30d60 73 69 62 6c 65 20 69 66 20 74 68 65 0a 20 20 20  sible if the.   
30d70 20 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67       ** root pag
30d80 65 20 69 73 20 70 61 67 65 20 31 29 2e 0a 20 20  e is page 1)..  
30d90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
30da0 20 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e   ** Whether or n
30db0 6f 74 20 74 68 69 73 20 69 73 20 70 6f 73 73 69  ot this is possi
30dc0 62 6c 65 20 2c 20 74 68 65 20 74 72 65 65 20 69  ble , the tree i
30dd0 73 20 6e 6f 77 20 62 61 6c 61 6e 63 65 64 2e 20  s now balanced. 
30de0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72  .        ** Ther
30df0 65 66 6f 72 65 20 69 73 20 6e 6f 20 6e 65 78 74  efore is no next
30e00 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
30e10 65 20 64 6f 2d 6c 6f 6f 70 2e 0a 20 20 20 20 20  e do-loop..     
30e20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 69     */ .        i
30e30 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
30e40 3d 30 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  =0 && !pPage->le
30e50 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
30e60 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61  rc = balance_sha
30e70 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a 20  llower(pPage);. 
30e80 20 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c           VVA_ONL
30e90 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  Y( pCur->pagesSh
30ea0 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20  uffled = 1 );.  
30eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30ec0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
30ed0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
30ee0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
30ef0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
30f00 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20  <=nMin ){.      
30f10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
30f20 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
30f30 2a 20 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20  * const pParent 
30f40 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
30f50 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Page-1];.      i
30f60 6e 74 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20  nt const iIdx = 
30f70 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
30f80 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20  e-1];..      rc 
30f90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30fa0 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ite(pParent->pDb
30fb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
30fc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30fd0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
30fe0 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
30ff0 43 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  CE.        if( p
31000 50 61 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20  Page->hasData.  
31010 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d         && pPage-
31020 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20  >nOverflow==1.  
31030 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d         && pPage-
31040 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
31050 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20  Page->nCell.    
31060 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d       && pParent-
31070 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20  >pgno!=1.       
31080 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43    && pParent->nC
31090 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20  ell==iIdx.      
310a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
310b0 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71  * Call balance_q
310c0 75 69 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65  uick() to create
310d0 20 61 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f   a new sibling o
310e0 66 20 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68  f pPage on which
310f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
31100 20 73 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66   store the overf
31110 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63  low cell. balanc
31120 65 5f 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74  e_quick() insert
31130 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20  s a new cell.   
31140 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70         ** into p
31150 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61  Parent, which ma
31160 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20  y cause pParent 
31170 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69  overflow. If thi
31180 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  s.          ** h
31190 61 70 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74  appens, the next
311a0 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74   interation of t
311b0 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20  he do-loop will 
311c0 62 61 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20  balance pParent 
311d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73  .          ** us
311e0 65 20 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65  e either balance
311f0 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61  _nonroot() or ba
31200 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20  lance_deeper(). 
31210 55 6e 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20  Until this.     
31220 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c       ** happens,
31230 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
31240 6c 6c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ll is stored in 
31250 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63  the aBalanceQuic
31260 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20  kSpace[].       
31270 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20     ** buffer. . 
31280 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
31290 20 20 20 20 20 20 2a 2a 20 54 68 65 20 70 75 72        ** The pur
312a0 70 6f 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  pose of the foll
312b0 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 69  owing assert() i
312c0 73 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20  s to check that 
312d0 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20 20 20 20  only a.         
312e0 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20   ** single call 
312f0 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  to balance_quick
31300 28 29 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65  () is made for e
31310 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
31320 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
31330 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
31340 77 65 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65  were not verifie
31350 64 2c 20 61 20 73 75 62 74 6c 65 20 62 75 67 20  d, a subtle bug 
31360 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a  involving reuse.
31370 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
31380 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63  the aBalanceQuic
31390 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73  kSpace[] might s
313a0 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20  neak in..       
313b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
313c0 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65  assert( (balance
313d0 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29  _quick_called++)
313e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
313f0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75   rc = balance_qu
31400 69 63 6b 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ick(pParent, pPa
31410 67 65 2c 20 61 42 61 6c 61 6e 63 65 51 75 69 63  ge, aBalanceQuic
31420 6b 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  kSpace);.       
31430 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
31440 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
31450 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
31460 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  e, call balance_
31470 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65 64  nonroot() to red
31480 69 73 74 72 69 62 75 74 65 20 63 65 6c 6c 73 0a  istribute cells.
31490 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74            ** bet
314a0 77 65 65 6e 20 70 50 61 67 65 20 61 6e 64 20 75  ween pPage and u
314b0 70 20 74 6f 20 32 20 6f 66 20 69 74 73 20 73 69  p to 2 of its si
314c0 62 6c 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  bling pages. Thi
314d0 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20  s involves.     
314e0 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e       ** modifyin
314f0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
31500 66 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68  f pParent, which
31510 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65   may cause pPare
31520 6e 74 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  nt to.          
31530 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  ** become overfu
31540 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
31550 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   The next iterat
31560 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
31570 6f 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  op.          ** 
31580 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65  will balance the
31590 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
315a0 63 6f 72 72 65 63 74 20 74 68 69 73 2e 0a 20 20  correct this..  
315b0 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
315c0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
315d0 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f  parent page beco
315e0 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68  mes overfull, th
315f0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
31600 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20  or cells.       
31610 20 20 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64     ** are stored
31620 20 69 6e 20 74 68 65 20 70 53 70 61 63 65 20 62   in the pSpace b
31630 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
31640 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f  immediately belo
31650 77 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  w. .          **
31660 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 69 74   A subsequent it
31670 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
31680 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c  o-loop will deal
31690 20 77 69 74 68 20 74 68 69 73 20 62 79 0a 20 20   with this by.  
316a0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69          ** calli
316b0 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ng balance_nonro
316c0 6f 74 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65  ot() (balance_de
316d0 65 70 65 72 28 29 20 6d 61 79 20 62 65 20 63 61  eper() may be ca
316e0 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20 20 20 20  lled first,.    
316f0 20 20 20 20 20 20 2a 2a 20 62 75 74 20 69 74 20        ** but it 
31700 64 6f 65 73 6e 27 74 20 64 65 61 6c 20 77 69 74  doesn't deal wit
31710 68 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  h overflow cells
31720 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 68   - just moves th
31730 65 6d 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20  em to a.        
31740 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70    ** different p
31750 61 67 65 29 2e 20 4f 6e 63 65 20 74 68 69 73 20  age). Once this 
31760 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
31770 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
31780 6f 74 28 29 20 0a 20 20 20 20 20 20 20 20 20 20  ot() .          
31790 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64  ** has completed
317a0 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  , it is safe to 
317b0 72 65 6c 65 61 73 65 20 74 68 65 20 70 53 70 61  release the pSpa
317c0 63 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62  ce buffer used b
317d0 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  y.          ** t
317e0 68 65 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c  he previous call
317f0 2c 20 61 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  , as the overflo
31800 77 20 63 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c  w cell data will
31810 20 68 61 76 65 20 62 65 65 6e 20 0a 20 20 20 20   have been .    
31820 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
31830 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 20  either into the 
31840 62 6f 64 79 20 6f 66 20 61 20 64 61 74 61 62 61  body of a databa
31850 73 65 20 70 61 67 65 20 6f 72 20 69 6e 74 6f 20  se page or into 
31860 74 68 65 20 6e 65 77 0a 20 20 20 20 20 20 20 20  the new.        
31870 20 20 2a 2a 20 70 53 70 61 63 65 20 62 75 66 66    ** pSpace buff
31880 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  er passed to the
31890 20 6c 61 74 74 65 72 20 63 61 6c 6c 20 74 6f 20   latter call to 
318a0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
318b0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  )..          */.
318c0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 70 53            u8 *pS
318d0 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
318e0 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70  geMalloc(pCur->p
318f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
31900 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61           rc = ba
31910 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50  lance_nonroot(pP
31920 61 72 65 6e 74 2c 20 69 49 64 78 2c 20 70 53 70  arent, iIdx, pSp
31930 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ace);.          
31940 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
31950 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
31960 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Free is not NULL
31970 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  , it points to t
31980 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
31990 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 20   used .         
319a0 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65 76 69     ** by a previ
319b0 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ous call to bala
319c0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49  nce_nonroot(). I
319d0 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a  ts contents are.
319e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
319f0 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68 65 72  ow stored either
31a00 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62 61 73   on real databas
31a10 65 20 70 61 67 65 73 20 6f 72 20 77 69 74 68 69  e pages or withi
31a20 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  n the .         
31a30 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61 63 65     ** new pSpace
31a40 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74 20 6d   buffer, so it m
31a50 61 79 20 62 65 20 73 61 66 65 6c 79 20 66 72 65  ay be safely fre
31a60 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  ed here. */.    
31a70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
31a80 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a  ageFree(pFree);.
31a90 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 09 20 20            }...  
31aa0 2f 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  /* The pSpace bu
31ab0 66 66 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65  ffer will be fre
31ac0 65 64 20 61 66 74 65 72 20 74 68 65 20 6e 65 78  ed after the nex
31ad0 74 20 63 61 6c 6c 20 74 6f 0a 09 20 20 2a 2a 20  t call to..  ** 
31ae0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
31af0 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72  ), or just befor
31b00 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
31b10 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76  returns, whichev
31b20 65 72 0a 09 20 20 2a 2a 20 63 6f 6d 65 73 20 66  er..  ** comes f
31b30 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  irst. */.       
31b40 20 20 20 70 46 72 65 65 20 3d 20 70 53 70 61 63     pFree = pSpac
31b50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 56 56 41  e;.          VVA
31b60 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67  _ONLY( pCur->pag
31b70 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29  esShuffled = 1 )
31b80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31b90 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
31ba0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
31bb0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  ..      /* The n
31bc0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
31bd0 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c   the do-loop bal
31be0 61 6e 63 65 73 20 74 68 65 20 70 61 72 65 6e 74  ances the parent
31bf0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
31c00 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
31c10 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  e);.      pCur->
31c20 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iPage--;.    }. 
31c30 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
31c40 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
31c50 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71   pFree ){.    sq
31c60 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46  lite3PageFree(pF
31c70 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
31c80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
31c90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
31ca0 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  cks all cursors 
31cb0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61  that point to ta
31cc0 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  ble pgnoRoot..**
31cd0 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65   If any of those
31ce0 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f 70   cursors were op
31cf0 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
31d00 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72 65  ==0 in a differe
31d10 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  nt.** database c
31d20 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61 74  onnection (a dat
31d30 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
31d40 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68 65   that shares the
31d50 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65 20   pager.** cache 
31d60 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
31d70 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64   connection) and
31d80 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e   that other conn
31d90 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f  ection .** is no
31da0 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e 63  t in the ReadUnc
31db0 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65 2c  ommmitted state,
31dc0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
31dd0 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  ne returns .** S
31de0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a  QLITE_LOCKED..**
31df0 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20 63  .** As well as c
31e00 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c  ursors with wrFl
31e10 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20 77  ag==0, cursors w
31e20 69 74 68 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c  ith .** isIncrbl
31e30 6f 62 48 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20  obHandle==1 are 
31e40 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65 64 20  also considered 
31e50 27 72 65 61 64 27 20 63 75 72 73 6f 72 73 20 62  'read' cursors b
31e60 65 63 61 75 73 65 0a 2a 2a 20 69 6e 63 72 65 6d  ecause.** increm
31e70 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
31e80 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  rs are used for 
31e90 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64  both reading and
31ea0 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
31eb0 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73  When pgnoRoot is
31ec0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
31ed0 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  f an intkey tabl
31ee0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
31ef0 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70   is also.** resp
31f00 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61  onsible for inva
31f10 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65  lidating increme
31f20 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
31f30 73 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65  s when the table
31f40 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68   row.** on which
31f50 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64   they are opened
31f60 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d   is deleted or m
31f70 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73  odified. Cursors
31f80 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
31f90 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  .** according to
31fa0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
31fb0 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ules:.**.**   1)
31fc0 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72   When BtreeClear
31fd0 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65  Table() is calle
31fe0 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d to completely 
31ff0 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65  delete the conte
32000 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61  nts.**      of a
32010 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70   B-Tree table, p
32020 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74  Exclude is set t
32030 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d  o zero and param
32040 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a  eter iRow is .**
32050 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e        set to non
32060 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63  -zero. In this c
32070 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e  ase all incremen
32080 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  tal blob cursors
32090 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e   open.**      on
320a0 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
320b0 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72  d at pgnoRoot ar
320c0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
320d0 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42  *.**   2) When B
320e0 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74  treeInsert(), Bt
320f0 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
32100 74 72 65 65 50 75 74 44 61 74 61 28 29 20 69 73  treePutData() is
32110 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20   called to .**  
32120 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62      modify a tab
32130 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51  le row via an SQ
32140 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78  L statement, pEx
32150 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20  clude is set to 
32160 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69  the .**      wri
32170 74 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74  te cursor used t
32180 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63  o do the modific
32190 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65  ation and parame
321a0 74 65 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a  ter iRow is set.
321b0 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 69  **      to the i
321c0 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66  nteger row id of
321d0 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72   the B-Tree entr
321e0 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  y being modified
321f0 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20  . Unless.**     
32200 20 70 45 78 63 6c 75 64 65 20 69 73 20 69 74 73   pExclude is its
32210 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  elf an increment
32220 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20  al blob cursor, 
32230 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65  then all increme
32240 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f  ntal.**      blo
32250 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
32260 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68  n row iRow of th
32270 65 20 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76  e B-Tree are inv
32280 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  alidated..**.** 
32290 20 20 33 29 20 49 66 20 62 6f 74 68 20 70 45 78    3) If both pEx
322a0 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61  clude and iRow a
322b0 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20  re set to zero, 
322c0 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  no incremental b
322d0 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  lob .**      cur
322e0 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
322f0 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
32300 69 6e 74 20 63 68 65 63 6b 46 6f 72 52 65 61 64  int checkForRead
32310 43 6f 6e 66 6c 69 63 74 73 28 0a 20 20 42 74 72  Conflicts(.  Btr
32320 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20  ee *pBtree,     
32330 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
32340 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65  base file to che
32350 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ck */.  Pgno pgn
32360 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  oRoot,          
32370 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61 64  /* Look for read
32380 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 69 73   cursors on this
32390 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 43 75   btree */.  BtCu
323a0 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 20  rsor *pExclude, 
323b0 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68      /* Ignore th
323c0 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69  is cursor */.  i
323d0 36 34 20 69 52 6f 77 20 20 20 20 20 20 20 20 20  64 iRow         
323e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
323f0 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
32400 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 29 7b  e changing */.){
32410 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
32420 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
32430 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  = pBtree->pBt;. 
32440 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
32450 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Btree->db;.  ass
32460 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
32470 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72  eHoldsMutex(pBtr
32480 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ee) );.  for(p=p
32490 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
324a0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
324b0 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65   if( p==pExclude
324c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
324d0 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
324e0 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e  !=pgnoRoot ) con
324f0 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
32500 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
32510 4c 4f 42 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  LOB.    if( p->i
32520 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
32530 26 26 20 28 20 0a 20 20 20 20 20 20 20 20 20 28  && ( .         (
32540 21 70 45 78 63 6c 75 64 65 20 26 26 20 69 52 6f  !pExclude && iRo
32550 77 29 0a 20 20 20 20 20 20 7c 7c 20 28 70 45 78  w).      || (pEx
32560 63 6c 75 64 65 20 26 26 20 21 70 45 78 63 6c 75  clude && !pExclu
32570 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  de->isIncrblobHa
32580 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e  ndle && p->info.
32590 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
325a0 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74  )){.      p->eSt
325b0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
325c0 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ALID;.    }.#end
325d0 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53  if.    if( p->eS
325e0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
325f0 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ID ) continue;. 
32600 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67     if( p->wrFlag
32610 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ==0 .#ifndef SQL
32620 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
32630 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49  B.     || p->isI
32640 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65  ncrblobHandle.#e
32650 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
32660 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68    sqlite3 *dbOth
32670 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e  er = p->pBtree->
32680 64 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  db;.      assert
32690 28 64 62 4f 74 68 65 72 29 3b 0a 20 20 20 20 20  (dbOther);.     
326a0 20 69 66 28 20 64 62 4f 74 68 65 72 21 3d 64 62   if( dbOther!=db
326b0 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c   && (dbOther->fl
326c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
326d0 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30  dUncommitted)==0
326e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
326f0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
32700 63 6b 65 64 28 64 62 2c 20 64 62 4f 74 68 65 72  cked(db, dbOther
32710 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
32720 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  n SQLITE_LOCKED_
32730 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
32740 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
32750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32760 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
32770 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
32780 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
32790 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
327a0 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
327b0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
327c0 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
327d0 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
327e0 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
327f0 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
32800 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
32810 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
32820 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
32830 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
32840 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
32850 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
32860 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
32870 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
32880 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
32890 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
328a0 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
328b0 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
328c0 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
328d0 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
328e0 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
328f0 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  th ignored..**.*
32900 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73  * If the seekRes
32910 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
32920 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
32930 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  a successful cal
32940 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  l to.** sqlite3B
32950 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 74 6f 20  treeMoveto() to 
32960 73 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72  seek cursor pCur
32970 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29   to (pKey, nKey)
32980 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
32990 62 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20  been performed. 
329a0 73 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68  seekResult is th
329b0 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 20  e search result 
329c0 72 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61  returned (a nega
329d0 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69  tive.** number i
329e0 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  f pCur points at
329f0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69   an entry that i
32a00 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28  s smaller than (
32a10 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a  pKey, nKey), or.
32a20 2a 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  ** a positive va
32a30 6c 75 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e  lue if pCur poin
32a40 74 73 20 61 74 20 61 6e 20 65 74 72 79 20 74 68  ts at an etry th
32a50 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
32a60 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65  n .** (pKey, nKe
32a70 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  y)). .**.** If t
32a80 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61  he seekResult pa
32a90 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
32aa0 65 6e 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d  en cursor pCur m
32ab0 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20  ay point to any 
32ac0 0a 2a 2a 20 65 6e 74 72 79 20 6f 72 20 74 6f 20  .** entry or to 
32ad0 6e 6f 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 2e  no entry at all.
32ae0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32af0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
32b00 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63  to seek.** the c
32b10 75 72 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65  ursor before the
32b20 20 6e 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20   new key can be 
32b30 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
32b40 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
32b50 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ert(.  BtCursor 
32b60 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
32b70 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
32b80 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61  data into the ta
32b90 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73  ble of this curs
32ba0 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  or */.  const vo
32bb0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
32bc0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
32bd0 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  y of the new rec
32be0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
32bf0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
32c00 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64  nData,  /* The d
32c10 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72  ata of the new r
32c20 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
32c30 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
32c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
32c50 62 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62  ber of extra 0 b
32c60 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
32c70 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  o data */.  int 
32c80 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20  appendBias,     
32c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
32ca0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69  ue if this is li
32cb0 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a  kely an append *
32cc0 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75  /.  int seekResu
32cd0 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
32ce0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
32cf0 70 72 69 6f 72 20 73 71 6c 69 74 65 33 42 74 72  prior sqlite3Btr
32d00 65 65 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c 20  eeMoveto() call 
32d10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
32d20 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b    int loc = seek
32d30 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 73 7a  Result;.  int sz
32d40 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  New;.  int idx;.
32d50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32d60 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
32d70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
32d80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32d90 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
32da0 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
32db0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
32dc0 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
32dd0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
32de0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
32df0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
32e00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
32e10 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
32e20 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
32e30 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
32e40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
32e50 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20 63 68  lag );.  rc = ch
32e60 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69  eckForReadConfli
32e70 63 74 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cts(pCur->pBtree
32e80 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
32e90 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 3b 0a 20  , pCur, nKey);. 
32ea0 20 69 66 28 20 72 63 20 29 7b 20 20 20 20 20 20   if( rc ){      
32eb0 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 54         .    /* T
32ec0 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
32ed0 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
32ee0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 61  ad lock */.    a
32ef0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
32f00 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
32f10 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65 74 75  ACHE );.    retu
32f20 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
32f30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
32f40 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
32f50 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
32f60 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  skip;.  }..  /* 
32f70 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
32f80 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
32f90 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
32fa0 74 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  this table..  **
32fb0 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61  .  ** In some ca
32fc0 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ses, the call to
32fd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
32fe0 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73 20 61  eto() below is a
32ff0 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a   no-op. For.  **
33000 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69   example, when i
33010 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20 69 6e  nserting data in
33020 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
33030 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 69  auto-generated i
33040 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73  nteger.  ** keys
33050 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79 65 72  , the VDBE layer
33060 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33   invokes sqlite3
33070 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f 20 66  BtreeLast() to f
33080 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 0a 20  igure out the . 
33090 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65 79 20   ** integer key 
330a0 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65 6e 20  to use. It then 
330b0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
330c0 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ion to actually 
330d0 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20 2a 2a  insert the .  **
330e0 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 69   data into the i
330f0 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20 49 6e  ntkey B-Tree. In
33100 20 74 68 69 73 20 63 61 73 65 20 73 71 6c 69 74   this case sqlit
33110 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20  e3BtreeMoveto() 
33120 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20  recognizes.  ** 
33130 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
33140 69 73 20 61 6c 72 65 61 64 79 20 77 68 65 72 65  is already where
33150 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
33160 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74 68  and returns with
33170 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61  out.  ** doing a
33180 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69  ny work. To avoi
33190 64 20 74 68 77 61 72 74 69 6e 67 20 74 68 65 73  d thwarting thes
331a0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c  e optimizations,
331b0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
331c0 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65  .  ** not to cle
331d0 61 72 20 74 68 65 20 63 75 72 73 6f 72 20 68 65  ar the cursor he
331e0 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 0a 20  re..  */.  if(. 
331f0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
33200 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
33210 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
33220 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c  noRoot, pCur)) |
33230 7c 20 28 21 6c 6f 63 20 26 26 0a 20 20 20 20 53  | (!loc &&.    S
33240 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
33250 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
33260 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e  to(pCur, pKey, n
33270 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c  Key, appendBias,
33280 20 26 6c 6f 63 29 29 0a 20 20 29 29 7b 0a 20 20   &loc)).  )){.  
33290 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
332a0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
332b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
332c0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
332d0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c   pPage->intKey |
332e0 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  | nKey>=0 );.  a
332f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
33300 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e  af || !pPage->in
33310 74 4b 65 79 20 29 3b 0a 20 20 54 52 41 43 45 28  tKey );.  TRACE(
33320 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d  ("INSERT: table=
33330 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61  %d nkey=%lld nda
33340 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73  ta=%d page=%d %s
33350 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
33360 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
33370 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67  Key, nData, pPag
33380 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  e->pgno,.       
33390 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65     loc==0 ? "ove
333a0 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65  rwrite" : "new e
333b0 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72  ntry"));.  asser
333c0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
333d0 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65   );.  allocateTe
333e0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
333f0 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70  newCell = pBt->p
33400 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20  TmpSpace;.  if( 
33410 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
33420 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
33430 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
33440 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
33450 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
33460 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a  pData, nData, nZ
33470 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  ero, &szNew);.  
33480 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
33490 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65  d_insert;.  asse
334a0 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53  rt( szNew==cellS
334b0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65  izePtr(pPage, ne
334c0 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  wCell) );.  asse
334d0 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45  rt( szNew<=MX_CE
334e0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
334f0 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69    idx = pCur->ai
33500 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
33510 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26  ;.  if( loc==0 &
33520 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  & CURSOR_VALID==
33530 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
33540 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20      u16 szOld;. 
33550 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70     assert( idx<p
33560 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
33570 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33580 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
33590 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
335a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67  f( rc ){.      g
335b0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
335c0 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c      }.    oldCel
335d0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
335e0 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66  ge, idx);.    if
335f0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
33600 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e  {.      memcpy(n
33610 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c  ewCell, oldCell,
33620 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   4);.    }.    s
33630 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50  zOld = cellSizeP
33640 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  tr(pPage, oldCel
33650 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65  l);.    rc = cle
33660 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c  arCell(pPage, ol
33670 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  dCell);.    if( 
33680 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
33690 73 65 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 64  sert;.    rc = d
336a0 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
336b0 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 20 20  dx, szOld);.    
336c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
336d0 4b 20 29 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f  K ) {.      goto
336e0 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
336f0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c   }.  }else if( l
33700 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  oc<0 && pPage->n
33710 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73  Cell>0 ){.    as
33720 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
33730 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b  f );.    idx = +
33740 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
33750 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 65 6c  r->iPage];.  }el
33760 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
33770 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
33780 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74   }.  rc = insert
33790 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
337a0 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c   newCell, szNew,
337b0 20 30 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74   0, 0);.  assert
337c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
337d0 7c 7c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  || pPage->nCell>
337e0 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  0 || pPage->nOve
337f0 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a  rflow>0 );..  /*
33800 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73   If no error has
33810 20 6f 63 63 75 72 65 64 20 61 6e 64 20 70 50 61   occured and pPa
33820 67 65 20 68 61 73 20 61 6e 20 6f 76 65 72 66 6c  ge has an overfl
33830 6f 77 20 63 65 6c 6c 2c 20 63 61 6c 6c 20 62 61  ow cell, call ba
33840 6c 61 6e 63 65 28 29 20 0a 20 20 2a 2a 20 74 6f  lance() .  ** to
33850 20 72 65 64 69 73 74 72 69 62 75 74 65 20 74 68   redistribute th
33860 65 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74  e cells within t
33870 68 65 20 74 72 65 65 2e 20 53 69 6e 63 65 20 62  he tree. Since b
33880 61 6c 61 6e 63 65 28 29 20 6d 61 79 20 6d 6f 76  alance() may mov
33890 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  e.  ** the curso
338a0 72 2c 20 7a 65 72 6f 20 74 68 65 20 42 74 43 75  r, zero the BtCu
338b0 72 73 6f 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20  rsor.info.nSize 
338c0 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 76 61 6c  and BtCursor.val
338d0 69 64 4e 4b 65 79 0a 20 20 2a 2a 20 76 61 72 69  idNKey.  ** vari
338e0 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
338f0 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
33900 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6c  ns of SQLite cal
33910 6c 65 64 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29  led moveToRoot()
33920 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 75 72   to move the cur
33930 73 6f 72 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f  sor.  ** back to
33940 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 61   the root page a
33950 73 20 62 61 6c 61 6e 63 65 28 29 20 75 73 65 64  s balance() used
33960 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74   to invalidate t
33970 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a  he contents.  **
33980 20 6f 66 20 42 74 43 75 72 73 6f 72 2e 61 70 50   of BtCursor.apP
33990 61 67 65 5b 5d 20 61 6e 64 20 42 74 43 75 72 73  age[] and BtCurs
339a0 6f 72 2e 61 69 49 64 78 5b 5d 2e 20 54 68 69 73  or.aiIdx[]. This
339b0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65   is no longer ne
339c0 63 65 73 73 61 72 79 2c 0a 20 20 2a 2a 20 61 73  cessary,.  ** as
339d0 20 62 61 6c 61 6e 63 65 28 29 20 61 6c 77 61 79   balance() alway
339e0 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
339f0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
33a00 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 0a 20  a valid entry.. 
33a10 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20 69   **.  ** There i
33a20 73 20 61 20 73 75 62 74 6c 65 20 62 75 74 20 69  s a subtle but i
33a30 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a  mportant optimiz
33a40 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20  ation here too. 
33a50 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20  When inserting. 
33a60 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65 63   ** multiple rec
33a70 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74  ords into an int
33a80 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e 67  key b-tree using
33a90 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f 72   a single cursor
33aa0 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61   (as can.  ** ha
33ab0 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63 65  ppen while proce
33ac0 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52 54  ssing an "INSERT
33ad0 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54   INTO ... SELECT
33ae0 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69 74  " statement), it
33af0 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74 61  .  ** is advanta
33b00 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20 74  geous to leave t
33b10 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
33b20 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
33b30 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ntry in.  ** the
33b40 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73 69   b-tree if possi
33b50 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72 73  ble. If the curs
33b60 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
33b70 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 0a  ing to the last.
33b80 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68    ** entry in th
33b90 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  e table, and the
33ba0 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72 74   next row insert
33bb0 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67 65  ed has an intege
33bc0 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65  r key.  ** large
33bd0 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
33be0 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79 2c  st existing key,
33bf0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
33c00 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20 20  to insert the.  
33c10 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20 73  ** row without s
33c20 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73 6f  eeking the curso
33c30 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 61  r. This can be a
33c40 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63 65   big performance
33c50 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70   boost..  */.  p
33c60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
33c70 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
33c80 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
33c90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33ca0 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
33cb0 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  low ){.    pCur-
33cc0 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20  >atLast = 0;.   
33cd0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43   rc = balance(pC
33ce0 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 75 73  ur);..    /* Mus
33cf0 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76 65  t make sure nOve
33d00 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74 20 74  rflow is reset t
33d10 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 74  o zero even if t
33d20 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20 20 20  he balance().   
33d30 20 2a 2a 20 66 61 69 6c 73 2e 20 20 49 6e 74 65   ** fails.  Inte
33d40 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
33d50 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ure corruption w
33d60 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 72  ill result other
33d70 77 69 73 65 2e 20 2a 2f 0a 20 20 20 20 70 43 75  wise. */.    pCu
33d80 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
33d90 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
33da0 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  w = 0;.  }.  ass
33db0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
33dc0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
33dd0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
33de0 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72  .end_insert:.  r
33df0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33e00 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e  ** Delete the en
33e10 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75 72  try that the cur
33e20 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
33e30 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
33e40 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
33e50 69 6e 67 20 61 74 20 61 20 61 72 62 69 74 72 61  ing at a arbitra
33e60 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  ry location..*/.
33e70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
33e80 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
33e90 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
33ea0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
33eb0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
33ec0 61 67 65 5d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  age];.  int idx;
33ed0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
33ee0 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72   *pCell;.  int r
33ef0 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  c;.  Pgno pgnoCh
33f00 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65  ild = 0;.  Btree
33f10 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
33f20 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
33f30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
33f40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
33f50 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
33f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
33f70 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
33f80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
33f90 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
33fa0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
33fb0 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
33fc0 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75  nly );.  if( pCu
33fd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
33fe0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
33ff0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
34000 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
34010 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  R(pCur->aiIdx[pC
34020 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
34030 65 2d 3e 6e 43 65 6c 6c 29 20 29 7b 0a 20 20 20  e->nCell) ){.   
34040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
34050 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75  RROR;  /* The cu
34060 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
34070 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67  ting to anything
34080 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
34090 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
340a0 3b 0a 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f  ;.  rc = checkFo
340b0 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  rReadConflicts(p
340c0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
340d0 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e  , pCur, pCur->in
340e0 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20  fo.nKey);.  if( 
340f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34100 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
34110 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
34120 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
34130 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34140 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
34150 44 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 3b  D_SHAREDCACHE );
34160 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
34170 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72    }..  /* Restor
34180 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
34190 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28 61  rsor position (a
341a0 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63 75   no-op if the cu
341b0 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a  rsor is not in .
341c0 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55    ** CURSOR_REQU
341d0 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20 61  IRESEEK state) a
341e0 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73 69  nd save the posi
341f0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
34200 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a  er cursors .  **
34210 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
34220 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63 61  e table. Then ca
34230 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
34240 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61  rite() on the pa
34250 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ge.  ** that the
34260 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64   entry will be d
34270 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a  eleted from..  *
34280 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72 63  /.  if( .    (rc
34290 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
342a0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 29 21  Position(pCur))!
342b0 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20  =0 ||.    (rc = 
342c0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
342d0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
342e0 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c 7c  ot, pCur))!=0 ||
342f0 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74  .    (rc = sqlit
34300 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
34310 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
34320 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
34330 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   rc;.  }..  /* L
34340 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77  ocate the cell w
34350 69 74 68 69 6e 20 69 74 73 20 70 61 67 65 20 61  ithin its page a
34360 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70  nd leave pCell p
34370 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20  ointing to the. 
34380 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c   ** data. The cl
34390 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66  earCell() call f
343a0 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f  rees any overflo
343b0 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
343c0 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
343d0 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20   cell. The cell 
343e0 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20  itself is still 
343f0 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  intact..  */.  i
34400 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
34410 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
34420 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
34430 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20  l(pPage, idx);. 
34440 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
34450 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69  f ){.    pgnoChi
34460 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  ld = get4byte(pC
34470 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ell);.  }.  rc =
34480 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
34490 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , pCell);.  if( 
344a0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
344b0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
344c0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
344d0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
344e0 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61  e entry we are a
344f0 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69  bout to delete i
34500 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20  s not a leaf so 
34510 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20  if we do not.   
34520 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   ** do something
34530 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61   we will leave a
34540 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65   hole on an inte
34550 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a  rnal page..    *
34560 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c  * We have to fil
34570 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f  l the hole by mo
34580 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66  ving in a cell f
34590 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65  rom a leaf.  The
345a0 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c  .    ** next Cel
345b0 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20  l after the one 
345c0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73  to be deleted is
345d0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
345e0 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  xist and.    ** 
345f0 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20  to be a leaf so 
34600 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20  we can use it.. 
34610 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73     */.    BtCurs
34620 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20  or leafCur;.    
34630 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 50 61  MemPage *pLeafPa
34640 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 75 6e 73  ge = 0;..    uns
34650 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78  igned char *pNex
34660 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  t;.    int notUs
34670 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ed;.    unsigned
34680 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20   char *tempCell 
34690 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
346a0 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
346b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
346c0 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
346d0 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29  (pCur, &leafCur)
346e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
346f0 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61  e3BtreeNext(&lea
34700 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b  fCur, &notUsed);
34710 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
34720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34730 61 73 73 65 72 74 28 20 6c 65 61 66 43 75 72 2e  assert( leafCur.
34740 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69 50  aiIdx[leafCur.iP
34750 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  age]==0 );.     
34760 20 70 4c 65 61 66 50 61 67 65 20 3d 20 6c 65 61   pLeafPage = lea
34770 66 43 75 72 2e 61 70 50 61 67 65 5b 6c 65 61 66  fCur.apPage[leaf
34780 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20  Cur.iPage];.    
34790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
347a0 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50 61  gerWrite(pLeafPa
347b0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
347c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
347d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
347e0 20 20 20 69 6e 74 20 6c 65 61 66 43 75 72 73 6f     int leafCurso
347f0 72 49 6e 76 61 6c 69 64 20 3d 20 30 3b 0a 20 20  rInvalid = 0;.  
34800 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74 3b 0a      u16 szNext;.
34810 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44 45        TRACE(("DE
34820 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64  LETE: table=%d d
34830 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20 66  elete internal f
34840 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20 66  rom %d replace f
34850 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a  rom leaf %d\n",.
34860 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
34870 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
34880 70 67 6e 6f 2c 20 70 4c 65 61 66 50 61 67 65 2d  pgno, pLeafPage-
34890 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64  >pgno));.      d
348a0 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
348b0 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
348c0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
348d0 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69        pNext = fi
348e0 6e 64 43 65 6c 6c 28 70 4c 65 61 66 50 61 67 65  ndCell(pLeafPage
348f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  , 0);.      szNe
34900 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  xt = cellSizePtr
34910 28 70 4c 65 61 66 50 61 67 65 2c 20 70 4e 65 78  (pLeafPage, pNex
34920 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
34930 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
34940 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b  Bt)>=szNext+4 );
34950 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  .      allocateT
34960 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
34970 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20       tempCell = 
34980 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
34990 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65        if( tempCe
349a0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
349b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
349c0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
349d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
349e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
349f0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
34a00 50 61 67 65 2c 20 69 64 78 2c 20 70 4e 65 78 74  Page, idx, pNext
34a10 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65  -4, szNext+4, te
34a20 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20  mpCell, 0);.    
34a30 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 54    }...      /* T
34a40 68 65 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e  he "if" statemen
34a50 74 20 69 6e 20 74 68 65 20 6e 65 78 74 20 63 6f  t in the next co
34a60 64 65 20 62 6c 6f 63 6b 20 69 73 20 63 72 69 74  de block is crit
34a70 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 20  ical.  The.     
34a80 20 2a 2a 20 73 6c 69 67 68 74 65 73 74 20 65 72   ** slightest er
34a90 72 6f 72 20 69 6e 20 74 68 61 74 20 73 74 61 74  ror in that stat
34aa0 65 6d 65 6e 74 20 77 6f 75 6c 64 20 61 6c 6c 6f  ement would allo
34ab0 77 20 53 51 4c 69 74 65 20 74 6f 20 6f 70 65 72  w SQLite to oper
34ac0 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ate.      ** cor
34ad0 72 65 63 74 6c 79 20 6d 6f 73 74 20 6f 66 20 74  rectly most of t
34ae0 68 65 20 74 69 6d 65 20 62 75 74 20 70 72 6f 64  he time but prod
34af0 75 63 65 20 76 65 72 79 20 72 61 72 65 20 66 61  uce very rare fa
34b00 69 6c 75 72 65 73 2e 20 20 54 6f 0a 20 20 20 20  ilures.  To.    
34b10 20 20 2a 2a 20 67 75 61 72 64 20 61 67 61 69 6e    ** guard again
34b20 73 74 20 74 68 69 73 2c 20 74 68 65 20 66 6f 6c  st this, the fol
34b30 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 68 65  lowing macros he
34b40 6c 70 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  lp to verify tha
34b50 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 22  t.      ** the "
34b60 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20 69 73  if" statement is
34b70 20 77 65 6c 6c 20 74 65 73 74 65 64 2e 0a 20 20   well tested..  
34b80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
34b90 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f  tcase( pPage->nO
34ba0 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50  verflow==0 && pP
34bb0 61 67 65 2d 3e 6e 46 72 65 65 3c 70 42 74 2d 3e  age->nFree<pBt->
34bc0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a  usableSize*2/3 .
34bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34be0 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e   && pLeafPage->n
34bf0 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20  Free+2+szNext > 
34c00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
34c10 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73  2/3 );.      tes
34c20 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f  tcase( pPage->nO
34c30 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50  verflow==0 && pP
34c40 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d  age->nFree==pBt-
34c50 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
34c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34c70 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e    && pLeafPage->
34c80 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e  nFree+2+szNext >
34c90 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
34ca0 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65  *2/3 );.      te
34cb0 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
34cc0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
34cd0 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74  Page->nFree==pBt
34ce0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
34cf0 2b 31 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1 .            
34d00 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67       && pLeafPag
34d10 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
34d20 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
34d30 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20  ize*2/3 );.     
34d40 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
34d50 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 26 26  ->nOverflow>0 &&
34d60 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 70   pPage->nFree<=p
34d70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
34d80 2f 33 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /3.             
34d90 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65      && pLeafPage
34da0 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
34db0 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
34dc0 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20  ze*2/3 );.      
34dd0 74 65 73 74 63 61 73 65 28 20 28 70 50 61 67 65  testcase( (pPage
34de0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
34df0 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e   (pPage->nFree >
34e00 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
34e10 2a 32 2f 33 29 29 0a 20 20 20 20 20 20 20 20 20  *2/3)).         
34e20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66          && pLeaf
34e30 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
34e40 4e 65 78 74 20 3d 3d 20 70 42 74 2d 3e 75 73 61  Next == pBt->usa
34e50 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 0a  bleSize*2/3 );..
34e60 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 61 67  .      if( (pPag
34e70 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
34e80 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  | (pPage->nFree 
34e90 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
34ea0 65 2a 32 2f 33 29 29 20 26 26 0a 20 20 20 20 20  e*2/3)) &&.     
34eb0 20 20 20 20 20 28 70 4c 65 61 66 50 61 67 65 2d       (pLeafPage-
34ec0 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20  >nFree+2+szNext 
34ed0 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
34ee0 65 2a 32 2f 33 29 0a 20 20 20 20 20 20 29 7b 0a  e*2/3).      ){.
34ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
34f00 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
34f10 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  if the internal 
34f20 6e 6f 64 65 20 69 73 20 6e 6f 77 20 65 69 74 68  node is now eith
34f30 65 72 20 6f 76 65 72 66 6c 6f 77 69 6e 67 0a 20  er overflowing. 
34f40 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 75 6e 64         ** or und
34f50 65 72 66 75 6c 6c 20 61 6e 64 20 74 68 65 20 6c  erfull and the l
34f60 65 61 66 20 6e 6f 64 65 20 77 69 6c 6c 20 62 65  eaf node will be
34f70 20 75 6e 64 65 72 66 75 6c 6c 20 61 66 74 65 72   underfull after
34f80 20 74 68 65 20 6a 75 73 74 20 63 65 6c 6c 20 0a   the just cell .
34f90 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65          ** copie
34fa0 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
34fb0 6c 20 6e 6f 64 65 20 69 73 20 64 65 6c 65 74 65  l node is delete
34fc0 64 20 66 72 6f 6d 20 69 74 2e 20 54 68 69 73 20  d from it. This 
34fd0 69 73 20 61 20 73 70 65 63 69 61 6c 0a 20 20 20  is a special.   
34fe0 20 20 20 20 20 2a 2a 20 63 61 73 65 20 62 65 63       ** case bec
34ff0 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
35000 20 62 61 6c 61 6e 63 65 28 29 20 74 6f 20 63 6f   balance() to co
35010 72 72 65 63 74 20 74 68 65 20 69 6e 74 65 72 6e  rrect the intern
35020 61 6c 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20  al node.        
35030 2a 2a 20 6d 61 79 20 63 68 61 6e 67 65 20 74 68  ** may change th
35040 65 20 74 72 65 65 20 73 74 72 75 63 74 75 72 65  e tree structure
35050 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
35060 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a  the contents of.
35070 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c          ** the l
35080 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 5d 20  eafCur.apPage[] 
35090 61 6e 64 20 6c 65 61 66 43 75 72 2e 61 69 49 64  and leafCur.aiId
350a0 78 5b 5d 20 61 72 72 61 79 73 2c 20 77 68 69 63  x[] arrays, whic
350b0 68 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  h will be.      
350c0 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
350d0 20 62 61 6c 61 6e 63 65 28 29 20 72 65 71 75 69   balance() requi
350e0 72 65 64 20 74 6f 20 63 6f 72 72 65 63 74 20 74  red to correct t
350f0 68 65 20 75 6e 64 65 72 66 75 6c 6c 20 6c 65 61  he underfull lea
35100 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 64  f.        ** nod
35110 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
35120 20 20 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 72        ** The for
35130 6d 75 6c 61 20 75 73 65 64 20 69 6e 20 74 68 65  mula used in the
35140 20 65 78 70 72 65 73 73 69 6f 6e 20 61 62 6f 76   expression abov
35150 65 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 66  e are based on f
35160 61 63 65 74 73 20 6f 66 0a 20 20 20 20 20 20 20  acets of.       
35170 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 66   ** the SQLite f
35180 69 6c 65 2d 66 6f 72 6d 61 74 20 74 68 61 74 20  ile-format that 
35190 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 6f 76  do not change ov
351a0 65 72 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  er time..       
351b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74   */.        test
351c0 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 46 72  case( pPage->nFr
351d0 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ee==pBt->usableS
351e0 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20  ize*2/3+1 );.   
351f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
35200 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b  LeafPage->nFree+
35210 32 2b 73 7a 4e 65 78 74 3d 3d 70 42 74 2d 3e 75  2+szNext==pBt->u
35220 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20  sableSize*2/3+1 
35230 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 61 66 43  );.        leafC
35240 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 31  ursorInvalid = 1
35250 3b 0a 20 20 20 20 20 20 7d 20 20 20 20 20 20 20  ;.      }       
35260 20 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   ..      if( rc=
35270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
35290 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
352a0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
352b0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
352c0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
352d0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65  erflowCell(pPage
352e0 2c 20 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c  , idx), pgnoChil
352f0 64 29 3b 0a 20 20 20 20 20 20 20 20 56 56 41 5f  d);.        VVA_
35300 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65  ONLY( pCur->page
35310 73 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b  sShuffled = 0 );
35320 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61  .        rc = ba
35330 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 20  lance(pCur);.   
35340 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
35350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
35360 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c   leafCursorInval
35370 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  id ){.        /*
35380 20 54 68 65 20 6c 65 61 66 2d 6e 6f 64 65 20 69   The leaf-node i
35390 73 20 6e 6f 77 20 75 6e 64 65 72 66 75 6c 6c 20  s now underfull 
353a0 61 6e 64 20 73 6f 20 74 68 65 20 74 72 65 65 20  and so the tree 
353b0 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
353c0 20 20 20 20 20 2a 2a 20 72 65 62 61 6c 61 6e 63       ** rebalanc
353d0 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65  ed. However, the
353e0 20 62 61 6c 61 6e 63 65 28 29 20 6f 70 65 72 61   balance() opera
353f0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 69 6e 74 65  tion on the inte
35400 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
35410 6e 6f 64 65 20 61 62 6f 76 65 20 6d 61 79 20 68  node above may h
35420 61 76 65 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ave modified the
35430 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 68   structure of th
35440 65 20 42 2d 54 72 65 65 20 61 6e 64 0a 20 20 20  e B-Tree and.   
35450 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 65 20 63       ** so the c
35460 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
35470 6f 66 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67  of leafCur.apPag
35480 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e  e[] and leafCur.
35490 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20 20 20  aiIdx[].        
354a0 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  ** may not be tr
354b0 75 73 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  usted..        *
354c0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  *.        ** It 
354d0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
354e0 74 6f 20 63 6f 70 79 20 74 68 65 20 61 6e 63 65  to copy the ance
354f0 73 74 72 79 20 66 72 6f 6d 20 70 43 75 72 2c 20  stry from pCur, 
35500 61 73 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  as the same.    
35510 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 28 29      ** balance()
35520 20 63 61 6c 6c 20 68 61 73 20 69 6e 76 61 6c 69   call has invali
35530 64 61 74 65 64 20 74 68 65 20 70 43 75 72 2d 3e  dated the pCur->
35540 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49  apPage[] and aiI
35550 64 78 5b 5d 0a 20 20 20 20 20 20 20 20 2a 2a 20  dx[].        ** 
35560 61 72 72 61 79 73 2e 20 0a 20 20 20 20 20 20 20  arrays. .       
35570 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
35580 68 65 20 63 61 6c 6c 20 74 6f 20 73 61 76 65 43  he call to saveC
35590 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
355a0 62 65 6c 6f 77 20 69 6e 74 65 72 6e 61 6c 6c 79  below internally
355b0 20 73 61 76 65 73 20 74 68 65 20 0a 20 20 20 20   saves the .    
355c0 20 20 20 20 2a 2a 20 6b 65 79 20 74 68 61 74 20      ** key that 
355d0 6c 65 61 66 43 75 72 20 69 73 20 63 75 72 72 65  leafCur is curre
355e0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
355f0 2e 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 65  . Currently, the
35600 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72  re.        ** ar
35610 65 20 74 77 6f 20 63 6f 70 69 65 73 20 6f 66 20  e two copies of 
35620 74 68 61 74 20 6b 65 79 20 69 6e 20 74 68 65 20  that key in the 
35630 74 72 65 65 20 2d 20 6f 6e 65 20 68 65 72 65 20  tree - one here 
35640 6f 6e 20 74 68 65 20 6c 65 61 66 0a 20 20 20 20  on the leaf.    
35650 20 20 20 20 2a 2a 20 70 61 67 65 20 61 6e 64 20      ** page and 
35660 6f 6e 65 20 6f 6e 20 73 6f 6d 65 20 69 6e 74 65  one on some inte
35670 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 74 68 65  rnal node in the
35680 20 74 72 65 65 2e 20 54 68 65 20 63 6f 70 79 20   tree. The copy 
35690 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
356a0 65 20 6c 65 61 66 20 6e 6f 64 65 20 69 73 20 61  e leaf node is a
356b0 6c 77 61 79 73 20 74 68 65 20 6e 65 78 74 20 6b  lways the next k
356c0 65 79 20 69 6e 20 74 72 65 65 2d 6f 72 64 65 72  ey in tree-order
356d0 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
356e0 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 6e 20 74      ** copy on t
356f0 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
35700 2e 20 53 6f 2c 20 74 68 65 20 63 61 6c 6c 20 74  . So, the call t
35710 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
35720 78 74 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  xt().        ** 
35730 63 61 6c 6c 73 20 72 65 73 74 6f 72 65 43 75 72  calls restoreCur
35740 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 74 6f  sorPosition() to
35750 20 70 6f 69 6e 74 20 74 68 65 20 63 75 72 73 6f   point the curso
35760 72 20 74 6f 20 74 68 65 20 63 6f 70 79 0a 20 20  r to the copy.  
35770 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
35780 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  on the internal 
35790 6e 6f 64 65 2c 20 74 68 65 6e 20 61 64 76 61 6e  node, then advan
357a0 63 65 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ces to the next 
357b0 65 6e 74 72 79 2c 0a 20 20 20 20 20 20 20 20 2a  entry,.        *
357c0 2a 20 77 68 69 63 68 20 68 61 70 70 65 6e 73 20  * which happens 
357d0 74 6f 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  to be the copy o
357e0 66 20 74 68 65 20 6b 65 79 20 6f 6e 20 74 68 65  f the key on the
357f0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a   internal node..
35800 20 20 20 20 20 20 20 20 2a 2a 20 4e 65 74 20 65          ** Net e
35810 66 66 65 63 74 3a 20 6c 65 61 66 43 75 72 20 69  ffect: leafCur i
35820 73 20 70 6f 69 6e 74 69 6e 67 20 62 61 63 6b 20  s pointing back 
35830 74 6f 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  to the duplicate
35840 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   cell.        **
35850 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
35860 65 20 72 65 6d 6f 76 65 64 2c 20 61 6e 64 20 74  e removed, and t
35870 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67  he leafCur.apPag
35880 65 5b 5d 20 61 6e 64 0a 20 20 20 20 20 20 20 20  e[] and.        
35890 2a 2a 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78  ** leafCur.aiIdx
358a0 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20 63 6f  [] arrays are co
358b0 72 72 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  rrect..        *
358c0 2f 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e  /.        VVA_ON
358d0 4c 59 28 20 50 67 6e 6f 20 6c 65 61 66 50 67 6e  LY( Pgno leafPgn
358e0 6f 20 3d 20 70 4c 65 61 66 50 61 67 65 2d 3e 70  o = pLeafPage->p
358f0 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 72  gno );.        r
35900 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
35910 73 69 74 69 6f 6e 28 26 6c 65 61 66 43 75 72 29  sition(&leafCur)
35920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35930 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35940 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
35950 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26  lite3BtreeNext(&
35960 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65  leafCur, &notUse
35970 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
35980 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20        pLeafPage 
35990 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  = leafCur.apPage
359a0 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b  [leafCur.iPage];
359b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
359c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
359d0 7c 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e  | pLeafPage->pgn
359e0 6f 3d 3d 6c 65 61 66 50 67 6e 6f 20 29 3b 0a 20  o==leafPgno );. 
359f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
35a00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
35a10 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 6c 65  leafCur.aiIdx[le
35a20 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20  afCur.iPage]==0 
35a30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
35a40 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
35a50 3d 72 63 0a 20 20 20 20 20 20 20 26 26 20 53 51  =rc.       && SQ
35a60 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
35a70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35a80 28 70 4c 65 61 66 50 61 67 65 2d 3e 70 44 62 50  (pLeafPage->pDbP
35a90 61 67 65 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  age)) .      ){.
35aa0 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
35ab0 28 70 4c 65 61 66 50 61 67 65 2c 20 30 2c 20 73  (pLeafPage, 0, s
35ac0 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zNext);.        
35ad0 56 56 41 5f 4f 4e 4c 59 28 20 6c 65 61 66 43 75  VVA_ONLY( leafCu
35ae0 72 2e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  r.pagesShuffled 
35af0 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  = 0 );.        r
35b00 63 20 3d 20 62 61 6c 61 6e 63 65 28 26 6c 65 61  c = balance(&lea
35b10 66 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61  fCur);.        a
35b20 73 73 65 72 74 28 20 6c 65 61 66 43 75 72 73 6f  ssert( leafCurso
35b30 72 49 6e 76 61 6c 69 64 20 7c 7c 20 21 6c 65 61  rInvalid || !lea
35b40 66 43 75 72 2e 70 61 67 65 73 53 68 75 66 66 6c  fCur.pagesShuffl
35b50 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
35b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b70 20 20 20 20 20 20 7c 7c 20 21 70 43 75 72 2d 3e        || !pCur->
35b80 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 29 3b  pagesShuffled );
35b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35ba0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
35bb0 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
35bc0 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65  (&leafCur);.  }e
35bd0 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28  lse{.    TRACE((
35be0 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
35bf0 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65  d delete from le
35c00 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  af %d\n",.      
35c10 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
35c20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
35c30 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c      rc = dropCel
35c40 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 63 65  l(pPage, idx, ce
35c50 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
35c60 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 69 66   pCell));.    if
35c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35c80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
35c90 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 20  lance(pCur);.   
35ca0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
35cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35cc0 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
35cd0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
35ce0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
35cf0 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
35d00 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
35d10 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
35d20 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
35d30 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
35d40 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
35d50 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79  le..**.** The ty
35d60 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65  pe of type is de
35d70 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
35d80 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  flags parameter.
35d90 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f    Only the.** fo
35da0 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f  llowing values o
35db0 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72  f flags are curr
35dc0 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f  ently in use.  O
35dd0 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a  ther values for.
35de0 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e  ** flags might n
35df0 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20  ot work:.**.**  
35e00 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c     BTREE_INTKEY|
35e10 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20  BTREE_LEAFDATA  
35e20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
35e30 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69  tables with rowi
35e40 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54  d keys.**     BT
35e50 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20  REE_ZERODATA    
35e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
35e70 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63  ed for SQL indic
35e80 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
35e90 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c   btreeCreateTabl
35ea0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
35eb0 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
35ec0 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ags){.  BtShared
35ed0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
35ee0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
35ef0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
35f00 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
35f10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
35f20 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
35f30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35f40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
35f50 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
35f60 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
35f70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23  ->readOnly );..#
35f80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
35f90 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
35fa0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
35fb0 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
35fc0 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
35fd0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
35fe0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
35ff0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
36000 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
36010 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
36020 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f  Move;      /* Mo
36030 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74  ve a page here t
36040 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
36050 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f  the root-page */
36060 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
36070 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20  ageMove; /* The 
36080 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
36090 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61   */..    /* Crea
360a0 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
360b0 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65   may probably re
360c0 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
360d0 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
360e0 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  e.    ** to make
360f0 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65   room for the ne
36100 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61  w tables root pa
36110 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73  ge. In case this
36120 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20   page turns.    
36130 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20  ** out to be an 
36140 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64  overflow page, d
36150 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c  elete all overfl
36160 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68  ow page-map cach
36170 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62  es.    ** held b
36180 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  y open cursors..
36190 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c      */.    inval
361a0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
361b0 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20  Cache(pBt);..   
361c0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c   /* Read the val
361d0 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72  ue of meta[3] fr
361e0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
361f0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
36200 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  re the.    ** ro
36210 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
36220 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ew table should 
36230 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74  go. meta[3] is t
36240 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
36250 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  page.    ** crea
36260 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74  ted so far, so t
36270 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
36280 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e   is (meta[3]+1).
36290 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
362a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
362b0 4d 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41  Meta(p, BTREE_LA
362c0 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c  RGEST_ROOT_PAGE,
362d0 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
362e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
362f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
36300 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
36310 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20   pgnoRoot++;..  
36320 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f    /* The new roo
36330 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  t-page may not b
36340 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61  e allocated on a
36350 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
36360 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e, or the.    **
36370 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61   PENDING_BYTE pa
36380 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ge..    */.    w
36390 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d  hile( pgnoRoot==
363a0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
363b0 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  t, pgnoRoot) ||.
363c0 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
363d0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
363e0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
363f0 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
36400 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
36410 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
36420 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
36430 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
36440 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
36450 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
36460 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
36470 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
36480 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
36490 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
364a0 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
364b0 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
364c0 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
364d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
364e0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
364f0 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f  ge(pBt, &pPageMo
36500 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70  ve, &pgnoMove, p
36510 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20  gnoRoot, 1);.   
36520 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36530 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
36540 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
36550 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d    if( pgnoMove!=
36560 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
36570 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73    /* pgnoRoot is
36580 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77   the page that w
36590 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
365a0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
365b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
365c0 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e  w table (assumin
365d0 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e  g an error did n
365e0 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77  ot occur). But w
365f0 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20  e were.      ** 
36600 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f  allocated pgnoMo
36610 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20  ve. If required 
36620 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20  (i.e. if it was 
36630 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  not allocated.  
36640 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64      ** by extend
36650 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74  ing the file), t
36660 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
36670 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f  at position pgno
36680 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Move.      ** is
36690 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c   already journal
366a0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
366b0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
366c0 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
366d0 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
366e0 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
366f0 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
36700 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
36710 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74  ly at pgnoRoot t
36720 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20  o pgnoMove. */. 
36730 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36740 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
36750 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
36760 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  oot, 0);.      i
36770 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36780 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
36790 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
367a0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
367b0 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Get(pBt, pgnoRoo
367c0 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  t, &eType, &iPtr
367d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
367e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
367f0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
36800 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70  ROOTPAGE || eTyp
36810 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
36820 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  GE ){.        re
36830 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
36840 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
36850 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
36860 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
36870 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
36880 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
36890 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
368a0 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20  _FREEPAGE );.   
368b0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
368c0 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c  Page(pBt, pRoot,
368d0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
368e0 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a  , pgnoMove, 0);.
368f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
36900 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20  e(pRoot);..     
36910 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70   /* Obtain the p
36920 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  age at pgnoRoot 
36930 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  */.      if( rc!
36940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36950 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
36970 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
36980 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
36990 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
369a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
369b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
369c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
369d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
369e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
369f0 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
36a00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
36a10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36a20 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
36a30 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
36a40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
36a60 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
36a70 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
36a80 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
36a90 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
36aa0 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
36ab0 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
36ac0 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
36ad0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
36ae0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
36af0 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
36b00 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
36b10 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
36b20 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
36b30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
36b40 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
36b50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
36b60 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
36b70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
36b80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
36b90 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
36ba0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
36bb0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
36bc0 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
36bd0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
36be0 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
36bf0 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
36c00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
36c10 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
36c20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36c30 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36c40 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
36c50 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
36c60 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50  pRoot, flags | P
36c70 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69  TF_LEAF);.  sqli
36c80 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52  te3PagerUnref(pR
36c90 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
36ca0 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74   *piTable = (int
36cb0 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74  )pgnoRoot;.  ret
36cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
36cd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
36ce0 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
36cf0 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
36d00 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
36d10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
36d20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
36d30 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
36d40 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69  reateTable(p, pi
36d50 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Table, flags);. 
36d60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
36d70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
36d80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
36d90 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
36da0 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
36db0 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
36dc0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
36dd0 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
36de0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
36df0 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
36e00 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
36e10 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
36e20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
36e30 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
36e40 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
36e50 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
36e60 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
36e70 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69   to clear */.  i
36e80 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c  nt freePageFlag,
36e90 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61       /* Dealloca
36ea0 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20  te page if true 
36eb0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e  */.  int *pnChan
36ec0 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ge.){.  MemPage 
36ed0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
36ee0 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
36ef0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
36f00 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
36f10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
36f20 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
36f30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70   );.  if( pgno>p
36f40 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
36f50 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
36f60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
36f70 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  BKPT;.  }..  rc 
36f80 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
36f90 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
36fa0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
36fb0 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
36fc0 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
36fd0 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
36fe0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
36ff0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
37000 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
37010 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
37020 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
37030 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
37040 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
37050 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61  pCell), 1, pnCha
37060 6e 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nge);.      if( 
37070 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
37080 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
37090 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
370a0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
370b0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
370c0 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
370d0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
370e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
370f0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
37100 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
37110 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
37120 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
37130 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61  ta[8]), 1, pnCha
37140 6e 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nge);.    if( rc
37150 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
37160 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
37170 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61   }else if( pnCha
37180 6e 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nge ){.    asser
37190 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
371a0 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67   );.    *pnChang
371b0 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e += pPage->nCel
371c0 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  l;.  }.  if( fre
371d0 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20  ePageFlag ){.   
371e0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
371f0 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Page);.  }else i
37200 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
37210 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
37220 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29  ->pDbPage))==0 )
37230 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  {.    zeroPage(p
37240 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61  Page, pPage->aDa
37250 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46  ta[0] | PTF_LEAF
37260 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74  );.  }..cleardat
37270 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20  abasepage_out:. 
37280 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
37290 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
372a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
372b0 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
372c0 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  n from a single 
372d0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
372e0 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69  abase.  iTable i
372f0 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  s.** the page nu
37300 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  mber of the root
37310 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
37320 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
37330 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74  ne returns,.** t
37340 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
37350 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c  empty, but still
37360 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54   exists..**.** T
37370 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
37380 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
37390 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
373a0 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
373b0 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f  * read cursors o
373c0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70  n the table.  Op
373d0 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  en write cursors
373e0 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
373f0 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65  e.** root of the
37400 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
37410 20 70 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74   pnChange is not
37420 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c   NULL, then tabl
37430 65 20 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65  e iTable must be
37440 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65   an intkey table
37450 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  . The.** integer
37460 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74   value pointed t
37470 6f 20 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73  o by pnChange is
37480 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
37490 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
374a0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
374b0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
374c0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
374d0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
374e0 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
374f0 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74  pnChange){.  int
37500 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
37510 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
37520 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
37530 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
37540 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
37550 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
37560 28 20 28 72 63 20 3d 20 63 68 65 63 6b 46 6f 72  ( (rc = checkFor
37570 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
37580 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21   iTable, 0, 1))!
37590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
375a0 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
375b0 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  do */.  }else if
375c0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
375d0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
375e0 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30  s(pBt, iTable, 0
375f0 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  )) ){.    /* not
37600 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
37610 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
37620 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
37630 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
37640 62 6c 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65  ble, 0, pnChange
37650 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
37660 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
37670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37680 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
37690 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20  nformation in a 
376a0 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68  table and add th
376b0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
376c0 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72  ble to.** the fr
376d0 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c  eelist.  Except,
376e0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
376f0 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65   principle table
37700 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20   (the one on.** 
37710 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72  page 1) is never
37720 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
37730 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  eelist..**.** Th
37740 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
37750 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
37760 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
37770 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
37780 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
37790 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
377a0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
377b0 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61  abled and the pa
377c0 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20  ge at iTable is 
377d0 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  not the last.** 
377e0 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
377f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
37800 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
37810 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74  ot page .** in t
37820 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37830 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74   is moved into t
37840 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  he slot formerly
37850 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20   occupied by.** 
37860 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20  iTable and that 
37870 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72  last slot former
37880 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74  ly occupied by t
37890 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
378a0 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  e.** is added to
378b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
378c0 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e  stead of iTable.
378d0 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61    In this say, a
378e0 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
378f0 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65   are kept at the
37900 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
37910 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
37920 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63   which.** is nec
37930 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56  essary for AUTOV
37940 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69  ACUUM to work ri
37950 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69  ght.  *piMoved i
37960 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
37970 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
37980 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65  t used to be the
37990 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
379a0 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  in the file befo
379b0 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20  re.** the move. 
379c0 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73   If no page gets
379d0 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64   moved, *piMoved
379e0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
379f0 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   The last root p
37a00 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20  age is recorded 
37a10 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74  in meta[3] and t
37a20 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d  he value of.** m
37a30 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65  eta[3] is update
37a40 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
37a50 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
37a60 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c  nt btreeDropTabl
37a70 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  e(Btree *p, Pgno
37a80 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
37a90 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
37aa0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
37ab0 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
37ac0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
37ad0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
37ae0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
37af0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
37b00 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
37b10 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a  TRANS_WRITE );..
37b20 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
37b30 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  al to drop a tab
37b40 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
37b50 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
37b60 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
37b70 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
37b80 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
37b90 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
37ba0 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
37bb0 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72  o move another r
37bc0 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c  oot-page to fill
37bd0 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74   a gap left by t
37be0 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  he deleted.  ** 
37bf0 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e  root page. If an
37c00 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73   open cursor was
37c10 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65   using this page
37c20 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
37c30 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20   .  ** occur..  
37c40 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43  */.  if( pBt->pC
37c50 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
37c60 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
37c70 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
37c80 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65  ->pCursor->pBtre
37c90 65 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  e->db);.    retu
37ca0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
37cb0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
37cc0 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
37cd0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
37ce0 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
37cf0 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69   &pPage, 0);.  i
37d00 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37d10 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
37d20 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
37d30 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a  (p, iTable, 0);.
37d40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37d50 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
37d60 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
37d70 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76  c;.  }..  *piMov
37d80 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ed = 0;..  if( i
37d90 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65  Table>1 ){.#ifde
37da0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
37db0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20  TOVACUUM.    rc 
37dc0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
37dd0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
37de0 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65  ge(pPage);.#else
37df0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
37e00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
37e10 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67    Pgno maxRootPg
37e20 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
37e30 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
37e40 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47  ta(p, BTREE_LARG
37e50 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26  EST_ROOT_PAGE, &
37e60 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
37e70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37e80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37e90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
37ea0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ge);.        ret
37eb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
37ec0 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c  .      if( iTabl
37ed0 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29  e==maxRootPgno )
37ee0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
37ef0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
37f00 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74  dropped is the t
37f10 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61  able with the la
37f20 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
37f30 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
37f40 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
37f50 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20  e, put the root 
37f60 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
37f70 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20   list. .        
37f80 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
37f90 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
37fa0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
37fb0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
37fc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
37fd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37fe0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
37ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
38000 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
38010 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
38020 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f   dropped does no
38030 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65  t have the large
38040 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
38050 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
38060 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
38070 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  So move the page
38080 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20   that does into 
38090 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
380a0 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
380b0 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67  deleted root-pag
380c0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
380d0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
380e0 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65  Move;.        re
380f0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
38100 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
38110 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
38120 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
38130 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
38140 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
38150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38160 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
38170 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
38180 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
38190 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76  tePage(pBt, pMov
381a0 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e, PTRMAP_ROOTPA
381b0 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30  GE, 0, iTable, 0
381c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
381d0 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
381e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
381f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
38200 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
38210 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
38220 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
38230 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
38240 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
38250 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
38260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
38270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
38280 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
38290 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
382a0 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76   = freePage(pMov
382b0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
382c0 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
382d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
382e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
382f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
38300 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
38310 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d      *piMoved = m
38320 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
38330 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
38340 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72  t the new 'max-r
38350 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20  oot-page' value 
38360 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
38370 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20  header. This.   
38380 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64     ** is the old
38390 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c   value less one,
383a0 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69   less one more i
383b0 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74  f that happens t
383c0 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20  o.      ** be a 
383d0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
383e0 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e  , less one again
383f0 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a   if that is the.
38400 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47        ** PENDING
38410 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20  _BYTE_PAGE..    
38420 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f    */.      maxRo
38430 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
38440 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
38450 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
38460 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
38470 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
38480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
38490 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
384a0 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
384b0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  Bt, maxRootPgno)
384c0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
384d0 6