/ Hex Artifact Content
Login

Artifact 50716b7a8bd32b9101bd3238ed7bd61fafe5cd67:


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 30 20 32 30 30 39 2f 30  c,v 1.620 2009/0
0190: 36 2f 30 38 20 31 34 3a 34 39 3a 34 36 20 64 61  6/08 14:49:46 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 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  = (pIter - pCell
6450: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e  );..  /* The min
6460: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79  imum size of any
6470: 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73   cell is 4 bytes
6480: 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65  . */.  if( nSize
6490: 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  <4 ){.    nSize 
64a0: 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  = 4;.  }..  asse
64b0: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
64c0: 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20  info.nSize );.  
64d0: 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a  return (u16)nSiz
64e0: 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  e;.}.#ifndef NDE
64f0: 42 55 47 0a 73 74 61 74 69 63 20 75 31 36 20 63  BUG.static u16 c
6500: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
6510: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
6520: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c  l){.  return cel
6530: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
6540: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
6550: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
6560: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
6570: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
6580: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
6590: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
65a0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
65b0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
65c0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
65d0: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
65e0: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
65f0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
6600: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
6610: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
6620: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
6630: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
6640: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
6650: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
6660: 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  fo;.  assert( pC
6670: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ell!=0 );.  sqli
6680: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
6690: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
66a0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
66b0: 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
66c0: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
66d0: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
66e0: 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
66f0: 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
6700: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
6710: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
6720: 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
6730: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
6740: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
6750: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
6760: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61      return ptrma
6770: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
6780: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
6790: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
67a0: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
67b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
67c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
67d0: 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43  ll with index iC
67e0: 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
67f0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
6800: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
6810: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
6820: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
6830: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
6840: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
6850: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
6860: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
6870: 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20  PutOvfl(MemPage 
6880: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
6890: 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  l){.  u8 *pCell;
68a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
68b0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
68c0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
68d0: 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69   );.  pCell = fi
68e0: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
68f0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20  Page, iCell);.  
6900: 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
6910: 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
6920: 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Cell);.}.#endif.
6930: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
6940: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
6950: 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72  n.  All Cells ar
6960: 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
6970: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  * end of the pag
6980: 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73  e and all free s
6990: 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65  pace is collecte
69a0: 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69  d into one.** bi
69b0: 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f  g FreeBlk that o
69c0: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
69d0: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
69e0: 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  cell.** pointer 
69f0: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65  array and the ce
6a00: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
6a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6a20: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
6a30: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
6a40: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6a60: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
6a70: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6a90: 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68  ddress of a i-th
6aa0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61   cell */.  int a
6ab0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
6ac0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6ad0: 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 61 66  of first byte af
6ae0: 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ter cell pointer
6af0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
6b00: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
6b10: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
6b20: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
6b30: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
6b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6b50: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
6b60: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
6b70: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
6b80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6b90: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
6ba0: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
6bb0: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
6bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
6bd0: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
6be0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
6bf0: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6c10: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
6c20: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
6c30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
6c60: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
6c70: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
6c80: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
6c90: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
6ca0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
6cb0: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
6cc0: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
6cd0: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
6ce0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
6cf0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
6d00: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
6d10: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
6d20: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
6d30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6d40: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
6d50: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
6d60: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
6d70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6d80: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
6d90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6da0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6db0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6dc0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
6dd0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
6de0: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
6df0: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
6e00: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
6e10: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
6e20: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
6e30: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
6e40: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
6e50: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
6e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
6e70: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
6e80: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
6e90: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
6ea0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6eb0: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
6ec0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
6ed0: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
6ee0: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
6ef0: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
6f00: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
6f10: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
6f20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
6f30: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
6f40: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
6f50: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
6f60: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
6f70: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
6f80: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
6f90: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
6fa0: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 69 66 28  (pAddr);.    if(
6fb0: 20 70 63 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20   pc>=usableSize 
6fc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6fd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6fe0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  KPT;.    }.    s
6ff0: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
7000: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
7010: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
7020: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
7030: 62 72 6b 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32  brk<cellOffset+2
7040: 2a 6e 43 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a  *nCell || pc+siz
7050: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
7060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7070: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
7090: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
70a0: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
70b0: 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63  k>=0 );.    memc
70c0: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
70d0: 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29  &temp[pc], size)
70e0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
70f0: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d  Addr, cbrk);.  }
7100: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
7110: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
7120: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
7130: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
7140: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
7150: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
7160: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
7170: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
7180: 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66    addr = cellOff
7190: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d  set+2*nCell;.  m
71a0: 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72  emset(&data[addr
71b0: 5d 2c 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29  ], 0, cbrk-addr)
71c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
71d0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
71e0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
71f0: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
7200: 6b 2d 61 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e  k-addr!=pPage->n
7210: 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Free ){.    retu
7220: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7230: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
7240: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7250: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
7260: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
7270: 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68   space from with
7280: 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61  in the B-Tree pa
7290: 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  ge passed.** as 
72a0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
72b0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 69  nt. Return the i
72c0: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
72d0: 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20  >aData[] of the 
72e0: 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20 6f  .** first byte o
72f0: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
7300: 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  e. .**.** The ca
7310: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
7320: 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20 62  that the space b
7330: 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
7340: 66 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73 65  f the cell-offse
7350: 74 20 0a 2a 2a 20 61 72 72 61 79 20 61 6e 64 20  t .** array and 
7360: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
7370: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
7380: 65 61 20 69 73 20 61 74 20 6c 65 61 73 74 20 6e  ea is at least n
7390: 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 69 6e  Byte bytes.** in
73a0: 20 73 69 7a 65 2e 20 53 6f 20 74 68 69 73 20 72   size. So this r
73b0: 6f 75 74 69 6e 65 20 63 61 6e 20 6e 65 76 65 72  outine can never
73c0: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   fail..**.** If 
73d0: 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
73e0: 79 20 36 30 20 6f 72 20 6d 6f 72 65 20 62 79 74  y 60 or more byt
73f0: 65 73 20 6f 66 20 66 72 61 67 6d 65 6e 74 73 20  es of fragments 
7400: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c  within the page,
7410: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20  .** the page is 
7420: 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66  defragmented bef
7430: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  ore returning. I
7440: 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20  f this were not 
7450: 64 6f 6e 65 20 74 68 65 72 65 0a 2a 2a 20 69 73  done there.** is
7460: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
7470: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
7480: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 63 6f  gmented bytes co
7490: 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  uld eventually .
74a0: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 74 68 65 20  ** overflow the 
74b0: 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 65 6c  single-byte fiel
74c0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2d 68 65  d of the page-he
74d0: 61 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  ader in which th
74e0: 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  is value.** is s
74f0: 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tored..*/.static
7500: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
7510: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
7520: 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  e, int nByte){. 
7530: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
7540: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
7550: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
7560: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
7570: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
7580: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
7590: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
75a0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
75b0: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
75c0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67  a */.  int nFrag
75d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
75f0: 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e  umber of fragmen
7600: 74 65 64 20 62 79 74 65 73 20 6f 6e 20 70 50 61  ted bytes on pPa
7610: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ge */.  int top;
7620: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
7630: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
7640: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
7650: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
7660: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
7670: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7680: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
7690: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
76a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
76b0: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
76c0: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
76d0: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
76e0: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
76f0: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
7700: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
7710: 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  low==0 );..  /* 
7720: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
7730: 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 74 68  space between th
7740: 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74 20 61 72  e cell-offset ar
7750: 72 61 79 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ray and the .  *
7760: 2a 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  * cell-content a
7770: 72 65 61 20 69 73 20 67 72 65 61 74 65 72 20 74  rea is greater t
7780: 68 61 6e 20 6e 42 79 74 65 20 62 79 74 65 73 2e  han nByte bytes.
7790: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
77a0: 6e 42 79 74 65 20 3c 3d 20 28 0a 20 20 20 20 20  nByte <= (.     
77b0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
77c0: 68 64 72 2b 35 5d 29 2d 28 68 64 72 2b 38 2b 28  hdr+5])-(hdr+8+(
77d0: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
77e0: 2b 32 2a 67 65 74 32 62 79 74 65 28 26 64 61 74  +2*get2byte(&dat
77f0: 61 5b 68 64 72 2b 33 5d 29 29 0a 20 20 29 29 3b  a[hdr+3])).  ));
7800: 0a 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ..  pPage->nFree
7810: 20 2d 3d 20 28 75 31 36 29 6e 42 79 74 65 3b 0a   -= (u16)nByte;.
7820: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
7830: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
7840: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 64 65  ag>=60 ){.    de
7850: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
7860: 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
7870: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
7880: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
7890: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
78a0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
78b0: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
78c0: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
78d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
78e0: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
78f0: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
7900: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
7910: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
7920: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61  ough to accomada
7930: 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  te it..    */.  
7940: 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a    int pc, addr;.
7950: 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72      for(addr=hdr
7960: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
7970: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
7980: 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20  >0; addr=pc){.  
7990: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67      int size = g
79a0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
79b0: 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a  +2]);     /* Siz
79c0: 65 20 6f 66 20 66 72 65 65 20 73 6c 6f 74 20 2a  e of free slot *
79d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  /.      if( size
79e0: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
79f0: 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20     int x = size 
7a00: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
7a10: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
7a20: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
7a30: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
7a40: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
7a50: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
7a60: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
7a70: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
7a80: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
7a90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
7aa0: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
7ab0: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
7ac0: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
7ad0: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
7ae0: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
7af0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7b00: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
7b10: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
7b20: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
7b30: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
7b40: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unt.          **
7b50: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
7b60: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
7b70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
7b80: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
7b90: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
7ba0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
7bb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20        return pc 
7bc0: 2b 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  + x;.      }.   
7bd0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
7be0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
7bf0: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
7c00: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
7c10: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
7c20: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
7c30: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
7c40: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
7c50: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
7c60: 2d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  - nByte;.  put2b
7c70: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7c80: 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e  , top);.  return
7c90: 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   top;.}../*.** R
7ca0: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
7cb0: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
7cc0: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
7cd0: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
7ce0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
7cf0: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
7d00: 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61  pPage->aDisk[sta
7d10: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
7d20: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
7d30: 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73   is "size" bytes
7d40: 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20  ..**.** Most of 
7d50: 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20  the effort here 
7d60: 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63  is involved in c
7d70: 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e  oalesing adjacen
7d80: 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73  t.** free blocks
7d90: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62   into a single b
7da0: 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a  ig free block..*
7db0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
7dc0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
7dd0: 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74  pPage, int start
7de0: 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69  , int size){.  i
7df0: 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c  nt addr, pbegin,
7e00: 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64   hdr;.  unsigned
7e10: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
7e20: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
7e30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
7e40: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
7e50: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
7e60: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
7e70: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
7e80: 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50  ssert( start>=pP
7e90: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
7ea0: 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a  +(pPage->leaf?0:
7eb0: 34 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  4) );.  assert( 
7ec0: 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d  (start + size)<=
7ed0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
7ee0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
7ef0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7f00: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
7f10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
7f20: 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29  ssert( size>=0 )
7f30: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
7f40: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
7f50: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7f60: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
7f70: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
7f80: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
7f90: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
7fa0: 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45   the SECURE_DELE
7fb0: 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  TE .  ** option 
7fc0: 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  is enabled at co
7fd0: 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20  mpile-time */.  
7fe0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
7ff0: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23  rt], 0, size);.#
8000: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
8010: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
8020: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
8030: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
8040: 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61  s */.  hdr = pPa
8050: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
8060: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
8070: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
8080: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
8090: 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74  ta[addr]))<start
80a0: 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a   && pbegin>0 ){.
80b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
80c0: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
80d0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
80e0: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 3d      if( pbegin<=
80f0: 61 64 64 72 20 29 20 7b 0a 20 20 20 20 20 20 72  addr ) {.      r
8100: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8110: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8120: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67  .    addr = pbeg
8130: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 20 28 20 70  in;.  }.  if ( p
8140: 62 65 67 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74  begin>pPage->pBt
8150: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
8160: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
8170: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8180: 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
8190: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20   pbegin>addr || 
81a0: 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  pbegin==0 );.  p
81b0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  ut2byte(&data[ad
81c0: 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70  dr], start);.  p
81d0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
81e0: 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20  art], pbegin);. 
81f0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
8200: 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b  start+2], size);
8210: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
8220: 2b 3d 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20  += (u16)size;.. 
8230: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
8240: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
8250: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50  s */.  addr = pP
8260: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  age->hdrOffset +
8270: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
8280: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
8290: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
82a0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
82b0: 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20  , psize, x;.    
82c0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
82d0: 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ddr );.    asser
82e0: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
82f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8300: 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74  e-4 );.    pnext
8310: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8320: 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20  a[pbegin]);.    
8330: 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  psize = get2byte
8340: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
8350: 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  );.    if( pbegi
8360: 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d  n + psize + 3 >=
8370: 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e   pnext && pnext>
8380: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  0 ){.      int f
8390: 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70  rag = pnext - (p
83a0: 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20  begin+psize);.  
83b0: 20 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29      if( (frag<0)
83c0: 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64   || (frag>(int)d
83d0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
83e0: 66 73 65 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20  fset+7]) ){.    
83f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8400: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8410: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
8420: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
8430: 73 65 74 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72  set+7] -= (u8)fr
8440: 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  ag;.      x = ge
8450: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
8460: 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32  xt]);.      put2
8470: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
8480: 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20  n], x);.      x 
8490: 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79  = pnext + get2by
84a0: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32  te(&data[pnext+2
84b0: 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20  ]) - pbegin;.   
84c0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
84d0: 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b  a[pbegin+2], x);
84e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
84f0: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
8500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8510: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
8520: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
8530: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
8540: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
8550: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
8560: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
8570: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
8580: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
8590: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
85a0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
85b0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
85c0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
85d0: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
85e0: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
85f0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
8600: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20  &data[hdr+5]) + 
8610: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
8620: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70  begin+2]);.    p
8630: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
8640: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a  r+5], top);.  }.
8650: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8660: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
8670: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
8680: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
8690: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
86a0: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
86b0: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
86c0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
86d0: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
86e0: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
86f0: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
8700: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
8710: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
8720: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
8730: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
8740: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
8750: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
8760: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
8770: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
8780: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
8790: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
87a0: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
87b0: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
87c0: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
87d0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
87e0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
87f0: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
8800: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
8810: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
8820: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
8830: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
8840: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
8850: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
8860: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
8870: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
8880: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
8890: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
88a0: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
88b0: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
88c0: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
88d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
88e0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
88f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
8900: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
8910: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
8920: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
8930: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
8940: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
8950: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
8960: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
8970: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
8980: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
8990: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
89a0: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
89b0: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
89c0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
89d0: 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  y = 1;.    pPage
89e0: 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67  ->hasData = pPag
89f0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61  e->leaf;.    pPa
8a00: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
8a10: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
8a20: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8a30: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
8a40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
8a50: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
8a60: 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ATA ){.    pPage
8a70: 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
8a80: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
8a90: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
8aa0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
8ab0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
8ac0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
8ad0: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
8ae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
8af0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8b00: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
8b10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
8b30: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
8b40: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
8b50: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
8b60: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
8b70: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
8b80: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
8b90: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
8ba0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
8bb0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
8bc0: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
8bd0: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
8be0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
8bf0: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
8c00: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
8c10: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
8c20: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
8c30: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
8c40: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
8c50: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
8c60: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
8c70: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
8c80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
8c90: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
8ca0: 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73  e *pPage){..  as
8cb0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8cc0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8cd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8ce0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8cf0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
8d00: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
8d10: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
8d20: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
8d30: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8d40: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
8d50: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8d60: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
8d70: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
8d80: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
8d90: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
8da0: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
8db0: 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ge) );..  if( !p
8dc0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
8dd0: 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20      u16 pc;     
8de0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8df0: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
8e00: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
8e10: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Data[] */.    u8
8e20: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
8e30: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
8e40: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
8e50: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38  header */.    u8
8e60: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
8e70: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
8e80: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20  ge->aData */.   
8e90: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
8ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
8eb0: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
8ec0: 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75 73  re */.    u16 us
8ed0: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
8ee0: 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65  Amount of usable
8ef0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
8f00: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63  age */.    u16 c
8f10: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
8f20: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
8f30: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
8f40: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
8f50: 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72 65   */.    u16 nFre
8f60: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
8f70: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
8f80: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
8f90: 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70 3b   */.    u16 top;
8fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8fb0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
8fc0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
8fd0: 61 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  a */..    pBt = 
8fe0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
8ff0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
9000: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
9010: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9020: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
9030: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
9040: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
9050: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9060: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
9070: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
9080: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
9090: 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a  eSize<=32768 );.
90a0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
90b0: 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  age = pBt->pageS
90c0: 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61  ize - 1;.    pPa
90d0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
90e0: 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  0;.    usableSiz
90f0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
9100: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
9110: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
9120: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
9130: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
9140: 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  af;.    top = ge
9150: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9160: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
9170: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
9180: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
9190: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
91a0: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
91b0: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
91c0: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
91d0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
91e0: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
91f0: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
9200: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9210: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9220: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 6d     }..    /* A m
9230: 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
9240: 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
9250: 73 65 20 75 73 65 20 74 6f 20 72 65 61 64 20 70  se use to read p
9260: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
9270: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
9280: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
9290: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
92a0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
92b0: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
92c0: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
92d0: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
92e0: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
92f0: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
9300: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
9310: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
9320: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
9330: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
9340: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  does..    */.#if
9350: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9360: 4f 56 45 52 52 45 41 44 5f 43 48 45 43 4b 29 20  OVERREAD_CHECK) 
9370: 7c 7c 20 31 0a 20 20 20 20 7b 0a 20 20 20 20 20  || 1.    {.     
9380: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
9390: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
93a0: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
93b0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
93c0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 2f 2a 20 4c  ellLast;    /* L
93d0: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
93e0: 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
93f0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9400: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
9410: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
9420: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
9430: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
9440: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
9450: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
9460: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
9470: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
9480: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 69  ->nCell;.      i
9490: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
94a0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 20  eSize - 4;.     
94b0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
94c0: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b  f ) iCellLast--;
94d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
94e0: 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
94f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63  i++){.        pc
9500: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9510: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
9520: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
9530: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
9540: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
9550: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
9560: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9570: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
9580: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
9590: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
95a0: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
95b0: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
95c0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
95d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
95e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
95f0: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
9600: 20 20 20 7d 0a 20 20 20 20 7d 20 20 0a 23 65 6e     }.    }  .#en
9610: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  dif..    /* Comp
9620: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
9630: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
9640: 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d  page */.    pc =
9650: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9660: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
9670: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
9680: 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c   + top;.    whil
9690: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20  e( pc>0 ){.     
96a0: 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b   u16 next, size;
96b0: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73  .      if( pc>us
96c0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20  ableSize-4 ){.  
96d0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
96e0: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70  ock is off the p
96f0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  age */.        r
9700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9710: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
9720: 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
9730: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9740: 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
9750: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9760: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
9770: 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65  if( next>0 && ne
9780: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b  xt<=pc+size+3 ){
9790: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
97a0: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
97b0: 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
97c0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  er */.        re
97d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
97e0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
97f0: 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b   }.      nFree +
9800: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  = size;.      pc
9810: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
9820: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
9830: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
9840: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
9850: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
9860: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
9870: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
9880: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
9890: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
98a0: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
98b0: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
98c0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
98d0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
98e0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
98f0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
9900: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
9910: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
9920: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
9930: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
9940: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
9950: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
9960: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
9970: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
9980: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
9990: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
99a0: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
99b0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
99c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
99d0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
99e0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
99f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9a00: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
9a10: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
9a20: 20 6e 46 72 65 65 20 2d 20 28 63 65 6c 6c 4f 66   nFree - (cellOf
9a30: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
9a40: 6e 43 65 6c 6c 29 3b 0a 0a 23 69 66 20 30 0a 20  nCell);..#if 0. 
9a50: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61   /* Check that a
9a60: 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20 69  ll the offsets i
9a70: 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65  n the cell offse
9a80: 74 20 61 72 72 61 79 20 61 72 65 20 77 69 74 68  t array are with
9a90: 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20  in range. .  ** 
9aa0: 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74  .  ** Omitting t
9ab0: 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  his consistency 
9ac0: 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67 20  check and using 
9ad0: 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  the pPage->maskP
9ae0: 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f  age mask.  ** to
9af0: 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75 6e   prevent overrun
9b00: 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20 62 75  ning the page bu
9b10: 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c  ffer in findCell
9b20: 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61 0a  () results in a.
9b30: 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f 72    ** 2.5% perfor
9b40: 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f  mance gain..  */
9b50: 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66  .  {.    u8 *pOf
9b60: 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65  f;        /* Ite
9b70: 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63 68  rator used to ch
9b80: 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66  eck all cell off
9b90: 73 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e 67  sets are in rang
9ba0: 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e  e */.    u8 *pEn
9bb0: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  d;        /* Poi
9bc0: 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20 63  nter to end of c
9bd0: 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79  ell offset array
9be0: 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b   */.    u8 mask;
9bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
9c00: 20 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d 75   of bits that mu
9c10: 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53  st be zero in MS
9c20: 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  B of cell offset
9c30: 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20  s */.    mask = 
9c40: 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67  ~(((u8)(pBt->pag
9c50: 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20  eSize>>8))-1);. 
9c60: 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61 5b     pEnd = &data[
9c70: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50 61  cellOffset + pPa
9c80: 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20  ge->nCell*2];.  
9c90: 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74 61    for(pOff=&data
9ca0: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f  [cellOffset]; pO
9cb0: 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28 2a  ff!=pEnd && !((*
9cc0: 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66  pOff)&mask); pOf
9cd0: 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20 70  f+=2);.    if( p
9ce0: 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20  Off!=pEnd ){.   
9cf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9d00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9d10: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
9d20: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
9d30: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  it = 1;.  }.  re
9d40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
9d60: 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
9d70: 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
9d80: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
9d90: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
9da0: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
9db0: 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
9dc0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9dd0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
9de0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
9df0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9e00: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
9e10: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
9e20: 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
9e30: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
9e40: 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
9e50: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9e60: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
9e70: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
9e80: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
9e90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9ea0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
9eb0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
9ec0: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
9ed0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9ee0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
9ef0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
9f00: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
9f10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
9f20: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
9f30: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
9f40: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9f50: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
9f60: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73  tex) );.  /*mems
9f70: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
9f80: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
9f90: 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61  e - hdr);*/.  da
9fa0: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
9fb0: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
9fc0: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
9fd0: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
9fe0: 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65  0 ?1:0);.  memse
9ff0: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
a000: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
a010: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
a020: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a030: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
a040: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
a050: 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ree = pBt->usabl
a060: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20  eSize - first;. 
a070: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
a080: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
a090: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
a0a0: 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63   hdr;.  pPage->c
a0b0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
a0c0: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  t;.  pPage->nOve
a0d0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73  rflow = 0;.  ass
a0e0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
a0f0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
a100: 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20  pageSize<=32768 
a110: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
a120: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Page = pBt->page
a130: 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67  Size - 1;.  pPag
a140: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
a150: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
a160: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
a170: 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
a180: 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
a190: 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
a1a0: 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
a1b0: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
a1c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
a1d0: 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
a1e0: 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
a1f0: 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
a200: 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
a210: 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
a220: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
a230: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
a240: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
a250: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
a260: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
a270: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
a280: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
a290: 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61  = pDbPage;.  pPa
a2a0: 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
a2b0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
a2c0: 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gno;.  pPage->hd
a2d0: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  rOffset = pPage-
a2e0: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
a2f0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   0;.  return pPa
a300: 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
a310: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
a320: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
a330: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
a340: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
a350: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
a360: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
a370: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
a380: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
a390: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
a3a0: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
a3b0: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
a3c0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
a3d0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
a3e0: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
a3f0: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
a400: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
a410: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
a420: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
a430: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
a440: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
a450: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
a460: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
a470: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
a480: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
a490: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
a4a0: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
a4b0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
a4c0: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
a4d0: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
a4e0: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  at point..*/.int
a4f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
a500: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
a510: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
a520: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
a530: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
a540: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a550: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
a560: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
a570: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
a580: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
a590: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
a5a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  r */.  int noCon
a5b0: 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44  tent        /* D
a5c0: 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20  o not load page 
a5d0: 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20  content if true 
a5e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
a5f0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
a600: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
a610: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a620: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
a630: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
a640: 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
a650: 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
a660: 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
a670: 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
a680: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a690: 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
a6a0: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
a6b0: 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
a6c0: 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
a6d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a6e0: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
a6f0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
a700: 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
a710: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
a720: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
a730: 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
a740: 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
a750: 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
a760: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
a770: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
a780: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
a790: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
a7a0: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
a7b0: 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
a7c0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
a7d0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
a7e0: 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
a7f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a800: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
a810: 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
a820: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
a830: 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
a840: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
a850: 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
a860: 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
a870: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
a880: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
a890: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
a8a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
a8b0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
a8c0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
a8d0: 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
a8e0: 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
a8f0: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
a900: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
a910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
a920: 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
a930: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
a940: 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31    int nPage = -1
a950: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
a960: 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
a970: 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 );.  rc = sqli
a980: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
a990: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
a9a0: 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  nPage);.  assert
a9b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a9c0: 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a  || nPage==-1 );.
a9d0: 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e    return (Pgno)n
a9e0: 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Page;.}../*.** G
a9f0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
aa00: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
aa10: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
aa20: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
aa30: 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e  just a convenien
aa40: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
aa50: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
aa60: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
aa70: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
aa80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
aa90: 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  tPage()..*/.stat
aaa0: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
aab0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
aac0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
aad0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
aae0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
aaf0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
ab00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
ab10: 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
ab20: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
ab30: 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge     /* Write 
ab40: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
ab50: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
ab60: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
ab70: 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
ab80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ab90: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
aba0: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  ) );.  if( pgno=
abb0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
abc0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
abd0: 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a  BKPT; .  }..  /*
abe0: 20 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65   It is often the
abf0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 70   case that the p
ac00: 61 67 65 20 77 65 20 77 61 6e 74 20 69 73 20 61  age we want is a
ac10: 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
ac20: 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74  .  ** If so, get
ac30: 20 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54   it directly.  T
ac40: 68 69 73 20 73 61 76 65 73 20 75 73 20 66 72 6f  his saves us fro
ac50: 6d 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c  m having to call
ac60: 0a 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63  .  ** pagerPagec
ac70: 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73  ount() to make s
ac80: 75 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68  ure pgno is with
ac90: 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68  in limits, which
aca0: 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e   results.  ** in
acb0: 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70   a measureable p
acc0: 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f  erformance impro
acd0: 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  vements..  */.  
ace0: 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 20  *ppPage = pPage 
acf0: 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
ad00: 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  p(pBt, pgno);.  
ad10: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
ad20: 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72 65   /* Page is alre
ad30: 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  ady in cache */.
ad40: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ad50: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
ad60: 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e 20   /* Page not in 
ad70: 63 61 63 68 65 2e 20 20 41 63 71 75 69 72 65 20  cache.  Acquire 
ad80: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
ad90: 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
ada0: 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
adb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
adc0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
add0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
ade0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
adf0: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
ae00: 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
ae10: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
ae20: 20 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50      pPage = *ppP
ae30: 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  age;.  }.  if( !
ae40: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
ae50: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ae60: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
ae70: 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Page);.  }.  if(
ae80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ae90: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
aea0: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  e(pPage);.    *p
aeb0: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
aec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
aed0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
aee0: 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
aef0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
af00: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
af10: 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  or.** call to sq
af20: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
af30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
af40: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
af50: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
af60: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
af70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
af80: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
af90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
afa0: 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d  eRefcount(pPage-
afb0: 3e 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20  >pDbPage)>1 );. 
afc0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
afd0: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
afe0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
aff0: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
b000: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b010: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b020: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
b030: 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73  pPage );.    ass
b040: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
b050: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
b060: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
b070: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
b080: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b090: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b0a0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b0b0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
b0c0: 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  nref(pPage->pDbP
b0d0: 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
b0e0: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
b0f0: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
b100: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
b110: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
b120: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
b130: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
b140: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
b150: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
b160: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
b170: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
b180: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
b190: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
b1a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
b1b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b1c0: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
b1d0: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
b1e0: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
b1f0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
b200: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
b210: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
b220: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
b230: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
b240: 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
b250: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
b260: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
b270: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
b280: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
b290: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
b2a0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
b2b0: 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
b2c0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
b2d0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
b2e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b2f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b300: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b310: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
b320: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
b330: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
b340: 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
b350: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
b360: 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
b370: 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
b380: 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
b390: 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
b3a0: 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
b3b0: 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
b3c0: 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
b3d0: 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
b3e0: 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
b3f0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  to sqlite3BtreeI
b400: 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c  nitPage() will l
b410: 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c  ikely return SQL
b420: 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20  ITE_CORRUPT..   
b430: 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72     ** But no har
b440: 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69  m is done by thi
b450: 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65  s.  And it is ve
b460: 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ry important tha
b470: 74 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  t.      ** sqlit
b480: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
b490: 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
b4a0: 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
b4b0: 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
b4c0: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
b4d0: 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
b4e0: 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
b4f0: 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
b500: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
b510: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
b520: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b530: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
b540: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
b550: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
b560: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
b570: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
b580: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
b590: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
b5a0: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
b5b0: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
b5c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b5d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b5e0: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
b5f0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
b600: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
b610: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
b620: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
b630: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
b640: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
b650: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
b660: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
b670: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
b680: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
b690: 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74  ULL.** a new dat
b6a0: 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e  abase with a ran
b6b0: 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61  dom name is crea
b6c0: 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f  ted.  This rando
b6d0: 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74  mly named.** dat
b6e0: 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
b6f0: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
b700: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
b710: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
b720: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
b730: 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
b740: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
b750: 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
b760: 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
b770: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
b780: 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
b790: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
b7a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
b7b0: 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
b7c0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
b7d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b7e0: 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
b7f0: 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
b800: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
b810: 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
b820: 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
b830: 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
b840: 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
b850: 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
b860: 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
b870: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
b880: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b890: 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
b8a0: 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
b8b0: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
b8c0: 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
b8d0: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
b8e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b8f0: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
b900: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
b910: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
b920: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
b930: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
b940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
b950: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
b960: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
b970: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
b980: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
b990: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
b9a0: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
b9b0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9d0: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
b9e0: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
b9f0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
ba00: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
ba10: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
ba20: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  en() */.){.  sql
ba30: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ba50: 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  he VFS to use fo
ba60: 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a  r this btree */.
ba70: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
ba80: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ba90: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
baa0: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
bab0: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
bac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bad0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
bae0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
baf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
bb00: 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
bb10: 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
bb20: 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
bb30: 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
bb40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bb50: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
bb60: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
bb70: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
bb80: 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
bb90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bba0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
bbb0: 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
bbc0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
bbd0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
bbe0: 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
bbf0: 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
bc00: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
bc10: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
bc20: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
bc30: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
bc40: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
bc50: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
bc60: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
bc70: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
bc80: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
bc90: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
bca0: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
bcb0: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
bcc0: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
bcd0: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
bce0: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
bcf0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
bd00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bd10: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
bd20: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
bd30: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
bd40: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
bd50: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
bd60: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
bd70: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
bd80: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
bd90: 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65   isMemdb = zFile
bda0: 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28  name && !strcmp(
bdb0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
bdc0: 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66  ory:");.  #endif
bdd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
bde0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
bdf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
be00: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
be10: 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d  ex) );..  pVfs =
be20: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d   db->pVfs;.  p =
be30: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
be40: 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
be50: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
be60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
be70: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
be80: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
be90: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
bea0: 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e   db;..#if !defin
beb0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
bec0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
bed0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bee0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
bef0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
bf00: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
bf10: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
bf20: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
bf30: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
bf40: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
bf50: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
bf60: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
bf70: 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20   if( isMemdb==0 
bf80: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  && zFilename && 
bf90: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
bfa0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
bfb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
bfc0: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
bfd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
bfe0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
bff0: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
c000: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
c010: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
c020: 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50  te3Malloc(nFullP
c030: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
c040: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
c050: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
c060: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
c070: 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  1;.      db->fla
c080: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61  gs |= SQLITE_Sha
c090: 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20  redCache;.      
c0a0: 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
c0b0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
c0c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
c0d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c0e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
c0f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
c100: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
c110: 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
c120: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
c130: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
c140: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
c150: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
c160: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
c170: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
c180: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
c190: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
c1a0: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
c1b0: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
c1c0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
c1d0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
c1e0: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
c1f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c200: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
c210: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
c220: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
c230: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
c240: 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
c250: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
c260: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
c270: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
c280: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
c290: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
c2a0: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
c2b0: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
c2c0: 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  er)).           
c2d0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
c2e0: 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
c2f0: 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
c300: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
c310: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
c320: 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69  iDb=db->nDb-1; i
c330: 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20  Db>=0; iDb--){. 
c340: 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65             Btree
c350: 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62   *pExisting = db
c360: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
c370: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
c380: 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78  pExisting && pEx
c390: 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74  isting->pBt==pBt
c3a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c3b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c3c0: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
c3d0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
c3e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c3f0: 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
c400: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
c410: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
c420: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
c430: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c440: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
c450: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
c460: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c470: 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT;.            
c480: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
c490: 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
c4a0: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
c4b0: 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
c4c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c4d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
c4f0: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
c500: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
c510: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
c520: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
c530: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
c540: 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
c550: 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
c560: 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
c570: 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
c580: 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
c590: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
c5a0: 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
c5b0: 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
c5c0: 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
c5d0: 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
c5e0: 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
c5f0: 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
c600: 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
c610: 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
c620: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
c630: 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
c640: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
c650: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
c660: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
c670: 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
c680: 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
c690: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
c6a0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
c6b0: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
c6c0: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
c6d0: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
c6e0: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
c6f0: 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
c700: 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
c710: 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
c720: 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
c730: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
c740: 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
c750: 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
c760: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
c770: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
c780: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69  )==8 || sizeof(i
c790: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
c7a0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
c7b0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
c7c0: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
c7d0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
c7e0: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
c7f0: 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
c800: 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
c810: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
c820: 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
c830: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
c840: 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
c850: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
c860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
c870: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
c880: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
c890: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
c8a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c8b0: 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
c8c0: 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
c8d0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20      EXTRA_SIZE, 
c900: 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29  flags, vfsFlags)
c910: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
c920: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c930: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
c940: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
c950: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
c960: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
c970: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
c980: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c990: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c9a0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
c9b0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
c9c0: 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
c9d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
c9e0: 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
c9f0: 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
ca00: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
ca10: 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
ca20: 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
ca30: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
ca40: 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61  einiter(pBt->pPa
ca50: 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ger, pageReinit)
ca60: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  ;.    pBt->pCurs
ca70: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
ca80: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
ca90: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
caa0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
cab0: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
cac0: 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ger);.    pBt->p
cad0: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
cae0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36  te(&zDbHeader[16
caf0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ]);.    if( pBt-
cb00: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
cb10: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
cb20: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
cb30: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
cb40: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
cb50: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
cb60: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
cb70: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
cb80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cb90: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
cba0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
cbb0: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
cbc0: 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
cbd0: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
cbe0: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
cbf0: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
cc00: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
cc10: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
cc20: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
cc30: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
cc40: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
cc50: 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
cc60: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
cc70: 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
cc80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
cc90: 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
cca0: 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
ccb0: 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
ccc0: 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
ccd0: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
cce0: 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
ccf0: 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
cd00: 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
cd10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
cd20: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
cd30: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
cd40: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
cd50: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
cd60: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
cd70: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
cd80: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
cd90: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
cda0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
cdb0: 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
cdc0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
cdd0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
cde0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cdf0: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
ce00: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
ce10: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
ce20: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
ce30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ce40: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
ce50: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
ce60: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
ce70: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
ce80: 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
ce90: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
cea0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
ceb0: 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
cec0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
ced0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
cee0: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
cef0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
cf00: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
cf10: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
cf20: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
cf30: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
cf40: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
cf50: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
cf60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
cf70: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
cf80: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
cf90: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
cfa0: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
cfb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
cfc0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
cfd0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
cfe0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
cff0: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
d000: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
d010: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
d020: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
d030: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
d040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d050: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
d060: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
d070: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
d080: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
d090: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65   = 1;.      mute
d0a0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
d0b0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
d0c0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
d0d0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69  MASTER);.      i
d0e0: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
d0f0: 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
d100: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
d110: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
d120: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
d130: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
d140: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
d150: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
d160: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
d170: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
d180: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d190: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
d1a0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
d1b0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
d1c0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
d1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d1e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
d1f0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
d200: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
d210: 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
d220: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
d230: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
d240: 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
d250: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
d260: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
d270: 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
d280: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d290: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
d2a0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
d2b0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
d2c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
d2d0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
d2e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d2f0: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
d300: 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
d310: 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
d320: 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
d330: 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
d340: 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
d350: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
d360: 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
d370: 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
d380: 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
d390: 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
d3a0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
d3b0: 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
d3c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
d3d0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
d3e0: 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
d3f0: 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
d400: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
d410: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
d420: 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
d430: 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
d440: 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
d450: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
d460: 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
d470: 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
d480: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
d490: 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
d4a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
d4b0: 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
d4c0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
d4d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d4e0: 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
d4f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d500: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
d510: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
d520: 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
d530: 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
d540: 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
d550: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
d560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d570: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
d580: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
d590: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
d5a0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
d5b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
d5c0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
d5d0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
d5e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d5f0: 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
d600: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
d610: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d620: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d630: 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
d640: 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
d650: 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
d660: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d670: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
d680: 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
d690: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
d6a0: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
d6b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
d6c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
d6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d6e0: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
d6f0: 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ee = 0;.  }.  if
d700: 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
d710: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d720: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
d730: 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
d740: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d750: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
d760: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
d770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
d780: 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
d790: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
d7a0: 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
d7b0: 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
d7c0: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
d7d0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
d7e0: 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
d7f0: 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
d800: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
d810: 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
d820: 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
d830: 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
d840: 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
d850: 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
d860: 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
d870: 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
d880: 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
d890: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
d8a0: 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69  RED_CACHE.  sqli
d8b0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
d8c0: 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  er;.  BtShared *
d8d0: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
d8e0: 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
d8f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d900: 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
d910: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73  mutex) );.  pMas
d920: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
d930: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
d940: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
d950: 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ER);.  sqlite3_m
d960: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
d970: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
d980: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
d990: 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
d9a0: 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
d9b0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
d9c0: 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
d9d0: 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
d9e0: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
d9f0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
da00: 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
da10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da20: 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
da30: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
da40: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
da50: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
da60: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
da70: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
da80: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
da90: 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
daa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dab0: 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
dac0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
dad0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
dae0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
daf0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
db00: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
db10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
db20: 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
db30: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
db40: 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
db50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
db60: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
db70: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
db80: 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
db90: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
dba0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
dbb0: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
dbc0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
dbd0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
dbe0: 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
dbf0: 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
dc00: 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
dc10: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
dc20: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
dc30: 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
dc40: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
dc50: 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
dc60: 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
dc70: 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  pageSize );.  }.
dc80: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
dc90: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
dca0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
dcb0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
dcc0: 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
dcd0: 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
dce0: 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d  e3PageFree( pBt-
dcf0: 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70  >pTmpSpace);.  p
dd00: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
dd10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  0;.}../*.** Clos
dd20: 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
dd30: 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
dd40: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
dd50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
dd60: 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
dd70: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
dd80: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
dd90: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
dda0: 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
ddb0: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
ddc0: 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
ddd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
dde0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ddf0: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
de00: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
de10: 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
de20: 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
de30: 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
de40: 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
de50: 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
de60: 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
de70: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
de80: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
de90: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
dea0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
deb0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
dec0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
ded0: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
dee0: 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
def0: 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
df00: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
df10: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
df20: 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
df30: 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
df40: 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
df50: 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
df60: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
df70: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c  llback(p);.  sql
df80: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
df90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
dfa0: 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
dfb0: 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
dfc0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
dfd0: 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
dfe0: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
dff0: 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
e000: 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
e010: 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
e020: 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
e030: 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
e040: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
e050: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
e060: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
e070: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
e080: 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
e090: 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
e0a0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
e0b0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
e0c0: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
e0d0: 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
e0e0: 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
e0f0: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
e100: 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
e110: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
e120: 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
e130: 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
e140: 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
e150: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
e160: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
e170: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
e180: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
e190: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
e1a0: 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
e1b0: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
e1c0: 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
e1d0: 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
e1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
e1f0: 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53  te3_free(pBt->pS
e200: 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
e210: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
e220: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e230: 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
e240: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e250: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
e260: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
e270: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
e280: 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
e290: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
e2a0: 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
e2b0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
e2c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
e2d0: 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
e2e0: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
e2f0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
e300: 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
e310: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e320: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
e330: 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
e340: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
e350: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
e360: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
e370: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
e380: 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
e390: 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
e3a0: 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
e3b0: 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
e3c0: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
e3d0: 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
e3e0: 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
e3f0: 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
e400: 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
e410: 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
e420: 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
e430: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
e440: 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
e450: 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
e460: 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
e470: 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
e480: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
e490: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
e4a0: 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
e4b0: 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
e4c0: 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
e4d0: 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
e4e0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
e4f0: 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
e500: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
e510: 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
e520: 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
e530: 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
e540: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
e550: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
e560: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
e570: 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
e580: 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
e590: 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
e5a0: 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
e5b0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
e5c0: 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
e5d0: 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
e5e0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
e5f0: 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
e600: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
e610: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
e620: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
e630: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e640: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
e650: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
e660: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
e670: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
e680: 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
e690: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
e6a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
e6b0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
e6c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e6d0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
e6e0: 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
e6f0: 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
e700: 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
e710: 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
e720: 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
e730: 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
e740: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
e750: 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
e760: 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
e770: 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
e780: 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
e790: 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
e7a0: 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
e7b0: 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
e7c0: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
e7d0: 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
e7e0: 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
e7f0: 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
e800: 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
e810: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
e820: 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
e830: 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
e840: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
e850: 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
e860: 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
e870: 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
e880: 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
e890: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e8a0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
e8b0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
e8c0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
e8d0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65  ree *p, int leve
e8e0: 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29  l, int fullSync)
e8f0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e900: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
e910: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e920: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
e930: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
e940: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
e950: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
e960: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
e970: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
e980: 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  l, fullSync);.  
e990: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
e9a0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
e9b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
e9c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
e9d0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
e9e0: 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
e9f0: 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
ea00: 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
ea10: 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
ea20: 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
ea30: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
ea40: 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
ea50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
ea60: 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
ea70: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
ea80: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
ea90: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
eaa0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
eab0: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
eac0: 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
ead0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
eae0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
eaf0: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
eb00: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
eb10: 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
eb20: 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
eb30: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
eb40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
eb50: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
eb60: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
eb70: 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
eb80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
eb90: 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
eba0: 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
ebb0: 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
ebc0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
ebd0: 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
ebe0: 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
ebf0: 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
ec00: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
ec10: 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
ec20: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
ec30: 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
ec40: 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
ec50: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
ec60: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
ec70: 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
ec80: 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
ec90: 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
eca0: 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
ecb0: 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
ecc0: 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
ecd0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
ece0: 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
ecf0: 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
ed00: 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
ed10: 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
ed20: 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
ed30: 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
ed40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ed50: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
ed60: 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
ed70: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
ed80: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
ed90: 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
eda0: 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
edb0: 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
edc0: 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
edd0: 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
ede0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
edf0: 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
ee00: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
ee10: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
ee20: 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
ee30: 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
ee40: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
ee50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
ee60: 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
ee70: 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
ee80: 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
ee90: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
eea0: 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
eeb0: 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
eec0: 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
eed0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
eee0: 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
eef0: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
ef00: 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
ef10: 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
ef20: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ef30: 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
ef40: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
ef50: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
ef60: 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
ef70: 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
ef80: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
ef90: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
efa0: 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
efb0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
efc0: 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
efd0: 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
efe0: 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
eff0: 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
f000: 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
f010: 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
f020: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
f030: 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
f040: 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
f050: 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
f060: 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
f070: 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
f080: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
f090: 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
f0a0: 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
f0b0: 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
f0c0: 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
f0d0: 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
f0e0: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
f0f0: 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
f100: 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
f110: 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
f120: 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
f130: 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
f140: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
f150: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
f160: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
f170: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
f180: 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61  ;.  }.  pBt->usa
f190: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
f1a0: 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
f1b0: 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
f1c0: 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53  Fix ) pBt->pageS
f1d0: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20  izeFixed = 1;.  
f1e0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
f1f0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
f200: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
f210: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
f220: 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
f230: 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
f240: 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
f250: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
f260: 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
f270: 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
f280: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
f290: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
f2a0: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
f2b0: 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
f2c0: 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
f2d0: 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
f2e0: 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
f2f0: 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
f300: 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
f310: 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
f320: 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
f330: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
f340: 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
f350: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
f360: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
f370: 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
f380: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
f390: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
f3a0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
f3b0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
f3c0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
f3d0: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
f3e0: 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
f3f0: 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
f400: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
f410: 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
f420: 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
f430: 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
f440: 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
f450: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
f460: 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
f470: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
f480: 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
f490: 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
f4a0: 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
f4b0: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
f4c0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
f4d0: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
f4e0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
f4f0: 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
f500: 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
f510: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
f520: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
f530: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e   return n;.}.#en
f540: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
f550: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
f560: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
f570: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f580: 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
f590: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
f5a0: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
f5b0: 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
f5c0: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
f5d0: 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
f5e0: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
f5f0: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
f600: 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
f610: 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
f620: 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
f630: 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
f640: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
f650: 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
f660: 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
f670: 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
f680: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
f690: 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
f6a0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f6b0: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
f6c0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
f6d0: 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
f6e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f6f0: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
f700: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
f710: 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
f720: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
f730: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f740: 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
f750: 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
f760: 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
f770: 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
f780: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
f790: 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  ed && (av ?1:0)!
f7a0: 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
f7b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
f7c0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
f7d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
f7e0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
f7f0: 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
f800: 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
f810: 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
f820: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
f830: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
f840: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f850: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
f860: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
f870: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
f880: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
f890: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
f8a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
f8b0: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
f8c0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
f8d0: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
f8e0: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
f8f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f900: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
f910: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
f920: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
f930: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
f940: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
f950: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
f960: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
f970: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
f980: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
f990: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
f9a0: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
f9b0: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
f9c0: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
f9d0: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
f9e0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
f9f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
fa00: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
fa10: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
fa20: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
fa30: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
fa40: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
fa50: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
fa60: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
fa70: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
fa80: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
fa90: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
faa0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
fab0: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
fac0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
fad0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
fae0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
faf0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
fb00: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
fb10: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
fb20: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
fb30: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
fb40: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
fb50: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
fb60: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
fb70: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
fb80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
fb90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
fba0: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
fbb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fbc0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
fbd0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
fbe0: 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
fbf0: 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
fc00: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
fc10: 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
fc20: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
fc30: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
fc40: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
fc50: 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
fc60: 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
fc70: 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
fc80: 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
fc90: 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
fca0: 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63  file. .  */.  rc
fcb0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
fcc0: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
fcd0: 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
fce0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fcf0: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70  OK ){.    goto p
fd00: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
fd10: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50  ;.  }else if( nP
fd20: 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  age>0 ){.    int
fd30: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69   pageSize;.    i
fd40: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  nt usableSize;. 
fd50: 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
fd60: 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
fd70: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
fd80: 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65  TADB;.    if( me
fd90: 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
fda0: 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
fdb0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
fdc0: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
fdd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fde0: 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
fdf0: 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e       pBt->readOn
fe00: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ly = 1;.    }.  
fe10: 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
fe20: 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
fe30: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
fe40: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
fe50: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
fe60: 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
fe70: 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
fe80: 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
fe90: 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
fea0: 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
feb0: 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
fec0: 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
fed0: 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
fee0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
fef0: 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
ff00: 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
ff10: 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
ff20: 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
ff30: 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
ff40: 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
ff50: 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
ff60: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
ff70: 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
ff80: 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
ff90: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
ffa0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
ffb0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
ffc0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
ffd0: 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20  page1[16]);.    
ffe0: 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
fff0: 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c  )&pageSize)!=0 |
10000 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  | pageSize<512 |
10010 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54  |.        (SQLIT
10020 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c  E_MAX_PAGE_SIZE<
10030 33 32 37 36 38 20 26 26 20 70 61 67 65 53 69 7a  32768 && pageSiz
10040 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
10050 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20  E_SIZE).    ){. 
10060 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
10070 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
10080 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
10090 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
100a0 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   );.    usableSi
100b0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
100c0 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
100d0 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74  f( pageSize!=pBt
100e0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
100f0 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
10100 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
10110 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
10120 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
10130 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
10140 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
10150 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
10160 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
10170 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
10180 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
10190 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
101a0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
101b0 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
101c0 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
101d0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
101e0 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
101f0 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
10200 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
10210 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
10220 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
10230 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
10240 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
10250 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
10260 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
10270 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65  ze = (u16)usable
10280 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
10290 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
102a0 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  )pageSize;.     
102b0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
102c0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
102d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
102e0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
102f0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
10300 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
10310 72 63 20 29 20 67 6f 74 6f 20 70 61 67 65 31 5f  rc ) goto page1_
10320 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
10330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10340 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
10350 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30  f( usableSize<50
10360 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
10370 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
10380 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  d;.    }.    pBt
10390 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31  ->pageSize = (u1
103a0 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  6)pageSize;.    
103b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
103c0 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a  = (u16)usableSiz
103d0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
103e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
103f0 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
10400 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
10410 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
10420 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
10430 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
10440 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
10450 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
10460 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
10470 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
10480 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
10490 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
104a0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
104b0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
104c0 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
104d0 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
104e0 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
104f0 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
10500 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
10510 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
10520 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
10530 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
10540 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
10550 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
10560 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
10570 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
10580 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
10590 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
105a0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
105b0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
105c0 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
105d0 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
105e0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
105f0 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
10600 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
10610 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
10620 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
10630 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65   poiner, a heade
10640 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
10650 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
10660 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
10670 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
10680 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
10690 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
106a0 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
106b0 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
106c0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42  ->maxLocal = (pB
106d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
106e0 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20  )*64/255 - 23;. 
106f0 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
10700 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
10710 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
10720 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  3;.  pBt->maxLea
10730 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  f = pBt->usableS
10740 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d  ize - 35;.  pBt-
10750 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d  >minLeaf = (pBt-
10760 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
10770 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61  32/255 - 23;.  a
10780 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
10790 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
107a0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
107b0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
107c0 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72   pPage1;.  retur
107d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
107e0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
107f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
10800 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
10810 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
10820 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10830 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
10840 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72  rks like lockBtr
10850 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  ee() except that
10860 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73   it also invokes
10870 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c   the.** busy cal
10880 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69  lback if there i
10890 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  s lock contentio
108a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
108b0 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
108c0 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29  try(Btree *pRef)
108d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
108e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
108f0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
10900 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29 20  oldsMutex(pRef) 
10910 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69  );.  if( pRef->i
10920 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
10930 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54  NE ){.    u8 inT
10940 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65  ransaction = pRe
10950 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
10960 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65  ction;.    btree
10970 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
10980 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10990 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
109a0 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70  (pRef, 0);.    p
109b0 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
109c0 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e  saction = inTran
109d0 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65  saction;.    pRe
109e0 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  f->inTrans = TRA
109f0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28  NS_NONE;.    if(
10a00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10a10 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42  {.      pRef->pB
10a20 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
10a30 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  -;.    }.    btr
10a40 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
10a50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10a60 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f  rc;.}.       ../
10a70 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
10a80 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
10a90 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
10aa0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
10ab0 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
10ac0 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
10ad0 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
10ae0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
10af0 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
10b00 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
10b10 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
10b20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
10b30 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
10b40 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
10b50 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
10b60 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
10b70 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
10b80 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
10b90 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ors, this routin
10ba0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
10bb0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
10bc0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
10bd0 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
10be0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10bf0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
10c00 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
10c10 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
10c20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
10c30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10c40 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
10c50 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
10c60 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
10c70 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
10c80 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42  pCursor==0 && pB
10c90 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
10ca0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
10cb0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
10cc0 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a  ->pPager)>=1 ){.
10cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
10ce0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
10cf0 20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   );.      releas
10d00 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  ePage(pBt->pPage
10d10 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  1);.    }.    pB
10d20 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
10d30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
10d40 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  te a new databas
10d50 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
10d60 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
10d70 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e   of the.** file.
10d80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
10d90 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
10da0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
10db0 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
10dc0 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
10dd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
10de0 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  t nPage;..  asse
10df0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10e00 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
10e10 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
10e20 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
10e30 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
10e40 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
10e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
10e60 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
10e70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10e80 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
10e90 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
10ea0 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
10eb0 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
10ec0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
10ed0 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
10ee0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
10ef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
10f00 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
10f10 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
10f20 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
10f30 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
10f40 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
10f50 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
10f60 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70  data[16], pBt->p
10f70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
10f80 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
10f90 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
10fa0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
10fb0 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
10fc0 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
10fd0 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
10fe0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
10ff0 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
11000 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
11010 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
11020 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
11030 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
11040 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
11050 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
11060 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
11070 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
11080 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
11090 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
110a0 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  TA );.  pBt->pag
110b0 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
110c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
110d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
110e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
110f0 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
11100 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
11110 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11120 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
11130 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
11140 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
11150 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
11160 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
11170 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
11180 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
11190 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
111a0 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
111b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
111c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
111d0 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
111e0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
111f0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
11200 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
11210 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
11220 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
11230 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
11240 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
11250 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
11260 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
11270 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
11280 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
11290 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
112a0 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
112b0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
112c0 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
112d0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
112e0 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
112f0 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
11300 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
11310 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
11320 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
11330 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
11340 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
11350 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
11360 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
11370 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
11380 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
11390 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
113a0 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
113b0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
113c0 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
113d0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
113e0 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
113f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
11400 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
11410 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
11420 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
11430 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
11440 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
11450 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
11460 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
11470 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
11480 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
11490 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
114a0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
114b0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
114c0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
114d0 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
114e0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
114f0 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
11500 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11510 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
11520 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
11530 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
11540 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
11550 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
11560 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
11570 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
11580 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
11590 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
115a0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
115b0 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
115c0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
115d0 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
115e0 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
115f0 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
11600 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
11610 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
11620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11630 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
11640 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
11650 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
11660 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
11670 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
11680 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
11690 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
116a0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
116b0 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
116c0 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
116d0 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
116e0 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
116f0 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
11700 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
11710 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
11720 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
11730 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
11740 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
11750 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
11760 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
11770 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
11780 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
11790 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
117a0 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
117b0 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
117c0 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
117d0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
117e0 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
117f0 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
11800 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
11810 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
11820 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
11830 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
11840 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
11850 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
11860 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
11870 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
11880 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
11890 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
118a0 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
118b0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
118c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
118d0 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
118e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
118f0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
11900 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
11910 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
11920 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
11930 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
11940 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
11950 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
11960 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
11970 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
11980 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
11990 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
119a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
119b0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
119c0 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
119d0 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
119e0 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
119f0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
11a00 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  un;.  }..  /* Wr
11a10 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
11a20 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
11a30 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
11a40 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
11a50 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
11a60 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
11a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
11a80 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
11a90 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
11aa0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11ab0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
11ac0 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74  CHE.  /* If anot
11ad0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
11ae0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
11af0 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
11b00 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
11b10 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
11b20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
11b30 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
11b40 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
11b50 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
11b60 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
11b70 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69  LOCKED..  */.  i
11b80 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
11b90 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11ba0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c  ==TRANS_WRITE) |
11bb0 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67  | pBt->isPending
11bc0 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
11bd0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
11be0 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
11bf0 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
11c00 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
11c10 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
11c20 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
11c30 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
11c40 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
11c50 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
11c60 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
11c70 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
11c80 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
11c90 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
11ca0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
11cb0 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
11cc0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
11cd0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
11ce0 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
11cf0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
11d00 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
11d10 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
11d20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20 7b  }.#endif..  do {
11d30 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
11d40 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
11d50 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
11d60 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
11d70 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
11d80 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
11d90 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
11da0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
11db0 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
11dc0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
11dd0 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
11de0 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
11df0 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
11e00 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
11e10 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
11e20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
11e30 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
11e40 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
11e50 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
11e60 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
11e70 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
11e80 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
11e90 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
11ea0 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
11eb0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
11ec0 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
11ed0 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
11ee0 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
11ef0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
11f00 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
11f10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11f20 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
11f30 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
11f40 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
11f50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11f60 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
11f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11f80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11f90 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
11fa0 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
11fb0 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
11fc0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
11fd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11fe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11ff0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
12000 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
12010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12020 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
12030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12040 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
12050 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
12060 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
12070 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
12080 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
12090 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
120a0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
120b0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
120c0 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
120d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
120e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
120f0 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
12100 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
12110 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20  ransaction++;.  
12120 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
12130 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
12140 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
12150 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
12160 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
12170 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
12180 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
12190 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
121a0 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rans;.    }.#ifn
121b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
121c0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
121d0 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
121e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
121f0 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
12200 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
12210 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
12220 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 28  >isExclusive = (
12230 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20  u8)(wrflag>1);. 
12240 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
12250 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
12260 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12270 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
12280 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
12290 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
122a0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
122b0 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
122c0 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
122d0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
122e0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
122f0 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
12300 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
12310 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
12320 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
12330 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
12340 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
12350 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
12360 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12370 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
12380 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
12390 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
123a0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
123b0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
123c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
123d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
123e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
123f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
12400 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
12410 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
12420 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
12430 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
12440 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
12450 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
12460 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
12470 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
12480 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
12490 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
124a0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
124b0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
124c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
124d0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
124e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
124f0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
12520 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
12530 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
12560 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
12570 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
125a0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
125b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
125c0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
125d0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
125e0 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
125f0 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
12600 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
12610 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12620 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
12630 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
12640 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
12650 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
12660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12670 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
12680 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
12690 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
126a0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
126b0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
126c0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
126d0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
126e0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
126f0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
12700 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
12710 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
12720 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12730 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
12740 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
12750 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
12760 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
12770 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
12780 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
12790 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
127a0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
127b0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
127c0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
127d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
127e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
127f0 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
12800 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
12810 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
12820 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
12830 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
12840 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
12850 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
12860 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
12870 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
12880 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
12890 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
128a0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f  pgno);.  }..set_
128b0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
128c0 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
128d0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
128e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
128f0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
12900 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68   on pPage, which
12910 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
12920 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  o be a btree pag
12930 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c  e, not an overfl
12940 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61  ow.** page, is a
12950 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
12960 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74   iFrom. Modify t
12970 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74  his pointer so t
12980 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
12990 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74  .** iTo. Paramet
129a0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
129b0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
129c0 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64  ointer to be mod
129d0 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f  ified, as .** fo
129e0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
129f0 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
12a00 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
12a10 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
12a20 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
12a30 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
12a40 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
12a50 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
12a60 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
12a70 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
12a80 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
12a90 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
12aa0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12ac0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
12ad0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
12ae0 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
12af0 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
12b00 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
12b10 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
12b20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
12b30 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
12b40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12b50 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
12b60 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
12b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
12b80 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
12b90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
12ba0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
12bb0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
12bc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12bd0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
12be0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
12bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12c00 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
12c10 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
12c20 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
12c30 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
12c40 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
12c50 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
12c60 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
12c70 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
12c80 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
12c90 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
12ca0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
12cb0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
12cc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12cd0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12ce0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
12cf0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
12d00 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
12d10 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
12d20 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
12d30 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
12d40 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
12d50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
12d60 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
12d70 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
12d80 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
12d90 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
12da0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
12db0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
12dc0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
12dd0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
12de0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
12df0 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
12e00 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
12e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
12e20 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
12e30 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
12e40 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
12e50 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
12e60 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
12e70 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65  m==get4byte(&pCe
12e80 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
12e90 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  w]) ){.         
12ea0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
12eb0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
12ec0 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
12ed0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12ee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12ef0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
12f00 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
12f10 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
12f20 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
12f30 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
12f40 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
12f50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
12f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12f70 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
12f80 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
12f90 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
12fa0 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
12fb0 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
12fc0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
12fd0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
12fe0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
12ff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13000 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
13010 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
13020 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
13030 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
13040 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
13050 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
13060 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
13070 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
13080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
13090 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
130a0 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
130b0 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
130c0 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
130d0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
130e0 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
130f0 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
13100 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74  s valid..*/.stat
13110 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
13120 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
13130 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
13140 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
13150 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
13160 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
13170 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
13180 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
13190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
131a0 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
131b0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
131c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
131d0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
131e0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
131f0 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
13200 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
13210 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
13220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13230 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
13240 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
13250 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b   int isCommit.){
13260 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
13270 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
13280 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
13290 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
132a0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
132b0 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
132c0 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
132d0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
132e0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
132f0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
13300 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
13310 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
13320 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
13330 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
13340 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
13350 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
13360 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
13370 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13380 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
13390 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
133a0 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
133b0 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
133c0 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
133d0 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
133e0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
133f0 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
13400 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
13410 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
13420 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
13430 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
13440 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
13450 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
13460 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
13470 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
13480 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13490 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
134a0 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
134b0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
134c0 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
134d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
134e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
134f0 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
13500 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
13510 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
13520 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
13530 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
13540 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
13550 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
13560 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
13570 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
13580 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
13590 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
135a0 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
135b0 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
135c0 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
135d0 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
135e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
135f0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
13600 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
13610 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
13620 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
13630 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
13640 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
13650 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
13660 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
13670 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
13680 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
13690 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
136a0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
136b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
136c0 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
136d0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
136e0 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
136f0 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
13700 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13720 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13730 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
13740 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
13750 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
13760 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
13770 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
13780 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
13790 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
137a0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
137b0 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29  LOW2, iFreePage)
137c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
137d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
137e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
137f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13800 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
13810 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
13820 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
13830 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
13840 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
13850 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
13860 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
13870 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
13880 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
13890 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
138a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
138b0 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
138c0 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
138d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
138e0 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
138f0 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
13900 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13910 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13920 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13930 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13940 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
13950 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
13960 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
13980 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
13990 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
139a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
139b0 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
139c0 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
139d0 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
139e0 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
139f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
13a00 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
13a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13a20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
13a30 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
13a40 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
13a50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  trPage);.    }. 
13a60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
13a70 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
13a80 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
13a90 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
13aa0 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
13ab0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
13ac0 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
13ad0 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
13ae0 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
13af0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
13b00 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
13b10 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
13b20 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
13b30 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75  cessful,.** retu
13b40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
13b50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
13b60 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
13b70 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69  refore no.** poi
13b80 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68  nt in calling th
13b90 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
13ba0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
13bb0 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  E_DONE..**.** Mo
13bc0 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74  re specificly, t
13bd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
13be0 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
13bf0 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74  nize the .** dat
13c00 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68  abase so that th
13c10 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
13c20 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
13c30 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e  y in use.** is n
13c40 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
13c50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46  .**.** If the nF
13c60 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  in parameter is 
13c70 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d  non-zero, the im
13c80 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73  plementation ass
13c90 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
13ca0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
13cb0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
13cc0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
13cd0 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
13ce0 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
13cf0 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
13d00 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
13d10 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
13d20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13d30 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
13d40 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
13d50 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
13d60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13d70 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
13d80 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
13d90 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
13da0 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20  LastPg){.  Pgno 
13db0 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
13dc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13dd0 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
13de0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
13df0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
13e00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13e10 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
13e20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
13e30 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
13e40 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
13e50 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
13e60 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
13e70 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
13e80 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
13e90 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
13ea0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
13eb0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
13ec0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
13ed0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
13ee0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
13ef0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
13f00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13f10 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
13f20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
13f30 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
13f40 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
13f50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13f80 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
13f90 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
13fa0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13fb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13fc0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
13fd0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
13fe0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
13ff0 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
14000 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
14010 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
14020 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
14030 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
14040 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
14050 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
14060 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
14070 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
14080 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
14090 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
140a0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
140b0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
140c0 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
140d0 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
140e0 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
140f0 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
14100 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
14110 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
14120 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
14130 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
14140 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
14150 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
14160 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
14170 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
14180 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
14190 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
141a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
141b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
141c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
141d0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
141e0 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
141f0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
14200 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
14210 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
14220 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
14230 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
14240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14250 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
14260 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
14270 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
14280 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
14290 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
142a0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
142b0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
142c0 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
142d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
142e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
142f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
14300 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
14310 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
14320 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
14330 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
14340 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
14350 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
14360 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
14370 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
14380 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
14390 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
143a0 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
143b0 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
143c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
143d0 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
143e0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
143f0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
14400 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
14410 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
14420 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
14430 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
14440 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
14450 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
14460 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
14470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
14480 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
14490 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
144a0 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
144b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
144c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
144d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
144e0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
144f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
14500 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14510 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14520 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
14530 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
14540 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
14550 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14560 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
14570 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
14580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14590 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
145a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
145b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
145c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
145d0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
145e0 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
145f0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
14600 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29  FreePg, nFin!=0)
14610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14620 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
14630 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
14640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14650 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14660 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
14670 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69  }.  }..  if( nFi
14680 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  n==0 ){.    iLas
14690 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  tPg--;.    while
146a0 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
146b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
146c0 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
146d0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
146e0 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  {.      if( PTRM
146f0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
14700 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
14710 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b     MemPage *pPg;
14720 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
14730 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
14740 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
14750 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  Pg, &pPg, 0);.  
14760 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14780 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
147a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
147b0 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
147c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
147d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
147e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
147f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14800 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14810 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
14820 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73      }.      iLas
14830 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  tPg--;.    }.   
14840 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
14850 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
14860 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29  pPager, iLastPg)
14870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
14880 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14890 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
148a0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
148b0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
148c0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
148d0 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
148e0 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
148f0 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
14900 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
14910 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
14920 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
14930 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
14940 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
14950 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
14960 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
14970 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
14980 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
14990 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
149a0 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
149b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
149c0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
149d0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
149e0 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
149f0 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
14a00 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
14a10 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
14a20 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14a30 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
14a40 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
14a50 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
14a60 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
14a70 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
14a80 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
14a90 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
14aa0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
14ab0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
14ac0 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
14ad0 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
14ae0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
14af0 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56  ;.    rc = incrV
14b00 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30  acuumStep(pBt, 0
14b10 2c 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  , pagerPagecount
14b20 28 70 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71  (pBt));.  }.  sq
14b30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
14b40 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
14b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14b60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14b70 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
14b80 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
14b90 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
14ba0 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
14bb0 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
14bc0 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
14bd0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
14be0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
14bf0 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
14c00 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
14c10 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
14c20 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
14c30 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
14c40 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
14c50 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
14c60 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
14c70 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
14c80 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
14c90 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
14ca0 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
14cb0 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
14cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
14cd0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
14ce0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
14cf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14d00 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
14d10 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
14d20 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
14d30 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
14d40 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
14d50 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
14d60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14d70 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
14d80 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
14d90 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
14da0 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
14db0 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
14dc0 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
14dd0 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
14de0 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20     Pgno nFin;.  
14df0 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20    Pgno nFree;.  
14e00 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a    Pgno nPtrmap;.
14e10 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 0a      Pgno iFree;.
14e20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67      const int pg
14e30 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  sz = pBt->pageSi
14e40 7a 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  ze;.    Pgno nOr
14e50 69 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ig = pagerPageco
14e60 75 6e 74 28 70 42 74 29 3b 0a 0a 20 20 20 20 69  unt(pBt);..    i
14e70 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
14e80 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
14e90 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
14ea0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
14eb0 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
14ec0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
14ed0 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
14ee0 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
14ef0 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
14f00 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
14f10 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
14f20 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
14f30 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
14f40 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
14f50 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
14f60 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
14f70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
14f80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14f90 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14fa0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
14fb0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
14fc0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
14fd0 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 50 74 72 6d  [36]);.    nPtrm
14fe0 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
14ff0 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
15000 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a  pBt, nOrig)+pgsz
15010 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20  /5)/(pgsz/5);.  
15020 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
15030 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
15040 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e  ;.    if( nOrig>
15050 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
15060 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
15070 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
15080 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
15090 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Fin--;.    }.   
150a0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
150b0 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
150c0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
150d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
150e0 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
150f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15100 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
15110 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
15120 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f  PT_BKPT;..    fo
15130 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
15140 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
15150 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
15160 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
15170 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
15180 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
15190 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
151a0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
151b0 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
151c0 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
151d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
151e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63  ITE_OK;.      rc
151f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
15200 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
15210 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
15220 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
15230 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
15240 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
15250 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
15260 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
15270 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
15280 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
15290 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
152a0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   nFin);.    }.  
152b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
152c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
152d0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
152e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
152f0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
15300 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67  nRef==sqlite3Pag
15310 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
15320 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
15330 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
15340 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15350 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
15360 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
15370 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
15380 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
15390 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
153a0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
153b0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
153c0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
153d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
153e0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
153f0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
15400 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
15410 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
15420 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
15430 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
15440 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
15450 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
15460 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
15470 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
15480 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
15490 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
154a0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
154b0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
154c0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
154d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
154e0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
154f0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
15500 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
15510 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
15520 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
15530 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
15540 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
15550 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
15560 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
15570 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
15580 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
15590 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
155a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
155b0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
155c0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
155d0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
155e0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
155f0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
15600 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
15610 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
15620 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
15630 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
15640 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
15650 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
15660 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
15670 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
15680 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
15690 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
156a0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
156b0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
156c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
156d0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
156e0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
156f0 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
15700 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
15710 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
15720 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
15730 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
15740 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
15750 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
15760 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
15770 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
15780 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
15790 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
157a0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
157b0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
157c0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
157d0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
157e0 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
157f0 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
15800 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
15810 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
15820 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
15830 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
15840 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
15850 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
15860 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
15870 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
15880 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
15890 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
158a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
158b0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
158c0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
158d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
158e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
158f0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
15900 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
15910 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
15920 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15930 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
15940 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
15950 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
15960 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
15980 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
15990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
159a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
159b0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
159c0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
159d0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
159e0 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
159f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15a00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15a10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15a20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15a30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
15a40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
15a50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
15a60 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
15a70 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
15a80 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
15a90 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15aa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
15ac0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
15ad0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
15ae0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
15af0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
15b00 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
15b10 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
15b20 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
15b30 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
15b40 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
15b50 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
15b60 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
15b70 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
15b80 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
15b90 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
15ba0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
15bb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
15bc0 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
15bd0 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
15be0 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
15bf0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
15c00 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
15c10 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
15c20 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
15c30 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
15c40 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
15c50 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
15c60 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
15c70 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
15c80 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
15c90 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
15ca0 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
15cb0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
15cc0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
15cd0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
15ce0 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
15cf0 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   locks..**.** Th
15d00 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
15d10 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
15d20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
15d30 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
15d40 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
15d50 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
15d60 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
15d70 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
15d80 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
15d90 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
15da0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
15db0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15dc0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15dd0 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
15de0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
15df0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
15e00 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
15e10 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
15e20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
15e30 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
15e40 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
15e50 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
15e60 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
15e70 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
15e80 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
15e90 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
15ea0 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
15eb0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15ec0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
15ed0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15ee0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
15ef0 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
15f00 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
15f10 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
15f20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
15f30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15f40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
15f50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15f60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15f70 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
15f80 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
15f90 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
15fa0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
15fb0 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
15fc0 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
15fd0 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
15fe0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
15ff0 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
16000 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
16010 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16020 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
16030 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
16040 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
16050 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
16060 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
16070 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
16080 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
16090 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
160a0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
160b0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
160c0 0a 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61  .    clearAllSha
160d0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
160e0 6b 73 28 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ks(p);.    pBt->
160f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
16100 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
16110 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
16120 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
16130 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
16140 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
16150 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63  ..  /* Set the c
16160 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
16170 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
16180 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
16190 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72  k.  ** the pager
161a0 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
161b0 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
161c0 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
161d0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
161e0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
161f0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d 3e  tent(pBt);.  p->
16200 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
16210 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  NONE;.  unlockBt
16220 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
16230 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
16240 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
16250 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16260 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16270 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
16280 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
16290 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
162a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
162b0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
162c0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
162d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
162e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
162f0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
16300 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
16310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16330 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
16340 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71  Two(p);.  }.  sq
16350 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16360 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
16370 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
16380 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
16390 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72  the number of wr
163a0 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite-cursors open
163b0 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   on this handle.
163c0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
163d0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
163e0 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
163f0 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
16400 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
16410 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
16420 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
16430 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
16440 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65  routine, a write
16450 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63  -cursor is any c
16460 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
16470 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74   capable of writ
16480 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
16490 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  se.  That means 
164a0 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a  the cursor was.*
164b0 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65  * originally ope
164c0 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
164d0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68  and the cursor h
164e0 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c  as not be disabl
164f0 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20  ed.** by having 
16500 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65  its state change
16510 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  d to CURSOR_FAUL
16520 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
16530 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
16540 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
16550 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
16560 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
16570 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
16580 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
16590 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
165a0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  t){.    if( pCur
165b0 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72  ->wrFlag && pCur
165c0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
165d0 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
165e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
165f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
16600 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
16610 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
16620 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
16630 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
16640 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
16650 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
16660 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
16670 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
16680 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
16690 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
166a0 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
166b0 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
166c0 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
166d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
166e0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
166f0 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
16700 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
16710 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
16720 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
16730 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
16740 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
16750 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
16760 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
16770 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
16780 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
16790 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
167a0 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
167b0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
167c0 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
167d0 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
167e0 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
167f0 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
16800 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
16810 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
16820 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
16830 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
16840 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
16850 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
16860 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
16870 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
16880 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
16890 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
168a0 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
168b0 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   *p;.  sqlite3Bt
168c0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
168d0 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
168e0 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
168f0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
16900 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
16910 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
16920 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70  Cursor(p);.    p
16930 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
16940 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
16950 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a  skip = errCode;.
16960 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
16970 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
16980 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16990 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
169a0 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65  .      p->apPage
169b0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
169c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
169d0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
169e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
169f0 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
16a00 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
16a10 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
16a20 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
16a30 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
16a40 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
16a50 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
16a60 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
16a70 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
16a80 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
16a90 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
16aa0 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
16ab0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
16ac0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
16ad0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
16ae0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
16af0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
16b00 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
16b10 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
16b20 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
16b30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16b40 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
16b50 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
16b60 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
16b70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
16b80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
16b90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16ba0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
16bb0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
16bc0 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  Bt, 0, 0);.#ifnd
16bd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16be0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66  HARED_CACHE.  if
16bf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16c00 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
16c10 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74  s a horrible sit
16c20 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72  uation. An IO or
16c30 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
16c40 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a  occurred whilst.
16c50 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
16c60 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
16c70 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
16c80 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
16c90 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
16ca0 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
16cb0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
16cc0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
16cd0 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
16ce0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
16cf0 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
16d00 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
16d10 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
16d20 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
16d30 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
16d40 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
16d50 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
16d60 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
16d70 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
16d80 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
16d90 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
16da0 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
16db0 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
16dc0 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
16dd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
16de0 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
16df0 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
16e00 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
16e10 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
16e20 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
16e30 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
16e40 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
16e50 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
16e60 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
16e70 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
16e80 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
16e90 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
16ea0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
16eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16ec0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
16ed0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
16ee0 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
16ef0 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
16f00 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
16f10 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
16f20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16f30 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
16f40 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
16f50 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
16f60 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
16f70 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
16f80 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
16f90 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
16fa0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
16fb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16fc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
16fd0 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
16fe0 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
16ff0 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
17000 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
17010 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
17020 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
17030 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
17040 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
17050 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
17060 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
17070 73 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  s(p);.    assert
17080 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
17090 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74  ion>0 );.    pBt
170a0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
170b0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74  ;.    if( 0==pBt
170c0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
170d0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
170e0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
170f0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  NS_NONE;.    }. 
17100 20 7d 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72   }..  btreeClear
17110 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
17120 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
17130 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e  TRANS_NONE;.  un
17140 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
17150 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65  d(pBt);..  btree
17160 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
17170 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17180 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17190 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
171a0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
171b0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
171c0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
171d0 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c   can can be roll
171e0 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
171f0 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
17200 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
17210 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
17220 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
17230 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
17240 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
17250 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
17260 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
17270 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
17280 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
17290 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
172a0 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
172b0 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
172c0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
172d0 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
172e0 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
172f0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
17300 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
17310 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
17320 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
17330 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
17340 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
17350 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
17360 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
17370 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
17380 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
17390 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
173a0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
173b0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
173c0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
173d0 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
173e0 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
173f0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
17400 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
17410 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
17420 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
17430 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
17440 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
17450 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
17460 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
17470 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
17480 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
17490 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
174a0 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
174b0 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
174c0 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
174d0 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
174e0 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
174f0 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
17500 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
17510 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
17520 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
17530 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
17540 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
17550 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
17560 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
17570 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
17580 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
17590 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
175a0 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
175b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
175c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
175d0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
175e0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
175f0 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
17600 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
17610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
17620 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
17630 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
17640 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
17650 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
17660 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
17670 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  t );.  if( NEVER
17680 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  (p->inTrans!=TRA
17690 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74 2d  NS_WRITE || pBt-
176a0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
176b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
176c0 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b  TERNAL;.  }else{
176d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
176e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
176f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
17700 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61      /* At the pa
17710 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
17720 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
17730 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
17740 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e  t with.    ** an
17750 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
17760 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
17770 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
17780 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 20 20  citly using.    
17790 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
177a0 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
177b0 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
177c0 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
177d0 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73 61  y.    ** such sa
177e0 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
177f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
17800 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
17810 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
17820 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
17830 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
17840 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
17850 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
17860 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
17870 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17890 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
178a0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
178b0 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
178c0 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
178d0 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
178e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
178f0 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
17900 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
17910 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
17920 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
17930 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
17940 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
17950 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
17960 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
17970 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
17980 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
17990 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
179a0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
179b0 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
179c0 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
179d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
179e0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
179f0 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
17a00 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
17a10 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
17a20 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
17a30 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
17a40 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
17a50 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
17a60 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
17a70 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
17a80 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
17a90 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
17aa0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
17ab0 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
17ac0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17ad0 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
17ae0 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
17af0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
17b00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17b10 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
17b20 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
17b30 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
17b40 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17b50 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
17b60 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
17b70 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
17b80 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
17b90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17ba0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
17bb0 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
17bc0 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
17bd0 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
17be0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
17bf0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
17c00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
17c10 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
17c20 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
17c30 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
17c40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17c50 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
17c60 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
17c70 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
17c80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
17c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17ca0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
17cb0 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
17cc0 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
17cd0 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
17ce0 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68  e.** iTable.  Th
17cf0 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72 69  e act of acquiri
17d00 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74 73  ng a cursor gets
17d10 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
17d20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
17d30 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
17d40 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
17d50 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
17d60 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
17d70 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
17d80 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
17d90 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
17da0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
17db0 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
17dc0 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
17dd0 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
17de0 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
17df0 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
17e00 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
17e10 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
17e20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
17e30 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
17e40 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
17e50 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
17e60 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
17e70 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
17e80 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
17e90 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
17ea0 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
17eb0 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
17ec0 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
17ed0 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
17ee0 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
17ef0 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
17f00 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
17f10 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
17f20 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
17f30 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
17f40 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
17f50 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
17f60 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
17f70 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
17f80 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
17f90 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
17fa0 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
17fb0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
17fc0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
17fd0 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
17fe0 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
17ff0 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
18000 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
18010 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
18020 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
18030 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
18040 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
18050 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
18060 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
18070 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
18080 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
18090 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
180a0 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
180b0 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
180c0 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
180d0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
180e0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
180f0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
18100 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20  reeCursorSize() 
18110 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
18120 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  .** pointed to b
18130 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65 6e  y pCur have been
18140 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20 63   zeroed by the c
18150 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
18160 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
18170 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
181a0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
181b0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181d0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
181e0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
181f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
18200 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18220 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
18230 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
18240 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
18250 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
18260 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
18270 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
18280 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
18290 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
182c0 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
182d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
182e0 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74 53  gno nPage;.  BtS
182f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18300 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
18310 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
18320 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
18330 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
18340 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b   || wrFlag==1 );
18350 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
18360 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
18370 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
18380 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 42 74     if( NEVER(pBt
18390 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
183a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
183b0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
183c0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 68 65 63   }.    rc = chec
183d0 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74  kForReadConflict
183e0 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20  s(p, iTable, 0, 
183f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
18400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18410 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
18420 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
18430 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20  REDCACHE );.    
18440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18450 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42   }.  }..  if( pB
18460 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a  t->pPage1==0 ){.
18470 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72      rc = lockBtr
18480 65 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a  eeWithRetry(p);.
18490 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
184a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
184b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
184c0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
184d0 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
184e0 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ble;.  rc = sqli
184f0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18500 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 28  t(pBt->pPager, (
18510 69 6e 74 20 2a 29 26 6e 50 61 67 65 29 3b 20 0a  int *)&nPage); .
18520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18530 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
18540 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
18550 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 6e 50 61  iTable==1 && nPa
18560 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ge==0 ){.    rc 
18570 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  = SQLITE_EMPTY;.
18580 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
18590 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
185a0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
185b0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
185c0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
185d0 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
185e0 5d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ]);.  if( rc!=SQ
185f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
18600 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
18610 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
18620 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
18630 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
18640 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
18650 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
18660 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
18670 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74  ariables, link t
18680 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
18690 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
186a0 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20   and set *ppCur 
186b0 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74  (the.  ** output
186c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
186d0 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a  s function)..  *
186e0 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  /.  pCur->pKeyIn
186f0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
18700 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
18710 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
18720 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72   pBt;.  pCur->wr
18730 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61  Flag = (u8)wrFla
18740 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
18750 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
18760 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
18770 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
18780 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
18790 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
187a0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
187b0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
187c0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
187d0 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  .  pCur->cachedR
187e0 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74  owid = 0;..  ret
187f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
18800 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
18810 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c 65 61  ception:.  relea
18820 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
18830 61 67 65 5b 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63  age[0]);.  unloc
18840 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
18850 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Bt);.  return rc
18860 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
18870 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
18880 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
188b0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
188c0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
188f0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
18900 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
18910 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18930 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
18940 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
18950 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
18960 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18980 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
18990 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
189a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
189b0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
189c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
189d0 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
189e0 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
189f0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
18a00 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18a10 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
18a20 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
18a30 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
18a40 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCur);.  sqlite3
18a50 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18a60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18a70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18a80 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
18a90 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
18aa0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
18ab0 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
18ac0 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
18ad0 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
18ae0 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
18af0 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
18b00 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
18b10 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
18b20 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
18b30 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
18b40 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
18b50 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
18b60 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
18b70 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
18b80 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
18b90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
18ba0 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
18bb0 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66  .  return sizeof
18bc0 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f  (BtCursor);.}../
18bd0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63  *.** Set the cac
18be0 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20  hed rowid value 
18bf0 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  of every cursor 
18c00 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
18c10 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20  base file.** as 
18c20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20  pCur and having 
18c30 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
18c40 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75  ge number as pCu
18c50 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  r.  The value is
18c60 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69  .** set to iRowi
18c70 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f  d..**.** Only po
18c80 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c  sitive rowid val
18c90 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
18ca0 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69  ed valid for thi
18cb0 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20  s cache..** The 
18cc0 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c  cache is initial
18cd0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e  ized to zero, in
18ce0 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61  dicating an inva
18cf0 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20  lid cache..** A 
18d00 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20  btree will work 
18d10 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f  fine with zero o
18d20 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
18d30 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e  s.  We just cann
18d40 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f  ot.** cache zero
18d50 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
18d60 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ids, which means
18d70 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65   tables that use
18d80 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61   zero or.** nega
18d90 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68  tive rowids migh
18da0 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
18db0 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70  lower.  But in p
18dc0 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a  ractice, zero.**
18dd0 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
18de0 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63  ids are very unc
18df0 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68  ommon so this sh
18e00 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72  ould not be a pr
18e10 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
18e20 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
18e30 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
18e40 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65  or *pCur, sqlite
18e50 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b  3_int64 iRowid){
18e60 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
18e70 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42    for(p=pCur->pB
18e80 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
18e90 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
18ea0 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
18eb0 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
18ec0 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  ) p->cachedRowid
18ed0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20   = iRowid;.  }. 
18ee0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
18ef0 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77  achedRowid==iRow
18f00 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  id );.}../*.** R
18f10 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64  eturn the cached
18f20 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67   rowid for the g
18f30 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20  iven cursor.  A 
18f40 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f  negative or zero
18f50 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
18f60 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
18f70 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
18f80 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  is invalid and s
18f90 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f  hould be.** igno
18fa0 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77  red.  If the row
18fb0 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76  id cache has nev
18fc0 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73  er before been s
18fd0 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65  et, then a.** ze
18fe0 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
18ff0 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
19000 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
19010 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
19020 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
19030 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68  eturn pCur->cach
19040 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  edRowid;.}../*.*
19050 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
19060 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
19070 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19080 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
19090 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
190a0 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
190b0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
190c0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
190d0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
190e0 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
190f0 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
19100 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
19110 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
19120 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
19130 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
19140 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
19150 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
19160 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
19170 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
19180 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
19190 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
191a0 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
191b0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
191c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
191d0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
191e0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
191f0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
19200 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
19210 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
19220 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
19230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
19240 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
19250 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
19260 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
19270 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
19280 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
19290 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
192a0 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
192b0 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
192c0 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  Cur);.    /* sql
192d0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
192e0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
192f0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
19300 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19320 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f  .** Make a tempo
19330 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20 66  rary cursor by f
19340 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69  illing in the fi
19350 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72  elds of pTempCur
19360 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61  ..** The tempora
19370 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  ry cursor is not
19380 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c   on the cursor l
19390 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72 65  ist for the Btre
193a0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
193b0 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
193c0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
193d0 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  Cur, BtCursor *p
193e0 54 65 6d 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  TempCur){.  int 
193f0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  i;.  assert( cur
19400 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
19410 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ur) );.  memcpy(
19420 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20  pTempCur, pCur, 
19430 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
19440 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70  );.  pTempCur->p
19450 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d  Next = 0;.  pTem
19460 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b  pCur->pPrev = 0;
19470 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70  .  for(i=0; i<=p
19480 54 65 6d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  TempCur->iPage; 
19490 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
194a0 33 50 61 67 65 72 52 65 66 28 70 54 65 6d 70 43  3PagerRef(pTempC
194b0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70  ur->apPage[i]->p
194c0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61  DbPage);.  }.  a
194d0 73 73 65 72 74 28 20 70 54 65 6d 70 43 75 72 2d  ssert( pTempCur-
194e0 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  >pKey==0 );.}../
194f0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
19500 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
19510 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
19520 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
19530 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
19540 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
19550 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19560 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
19570 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
19580 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69   *pCur){.  int i
19590 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
195a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
195b0 72 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  r) );.  for(i=0;
195c0 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
195d0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
195e0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75  e3PagerUnref(pCu
195f0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44  r->apPage[i]->pD
19600 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71  bPage);.  }.  sq
19610 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
19620 3e 70 4b 65 79 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  >pKey);.}..../*.
19630 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
19640 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
19650 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
19660 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
19670 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
19680 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
19690 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
196a0 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71  alid, call.** sq
196b0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
196c0 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
196d0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
196e0 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
196f0 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
19700 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
19710 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
19720 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
19730 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
19740 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73  er of calls to s
19750 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
19760 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
19770 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
19780 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
19790 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
197a0 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
197b0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
197c0 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
197d0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
197e0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
197f0 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
19800 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
19810 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
19820 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
19830 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
19840 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
19850 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
19860 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
19870 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
19880 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
19890 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
198a0 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
198b0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
198c0 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
198d0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
198e0 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
198f0 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
19900 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
19910 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
19920 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
19930 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
19940 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
19950 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
19960 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
19970 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
19980 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
19990 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
199a0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
199b0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
199c0 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
199d0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
199e0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
199f0 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
19a00 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
19a10 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
19a20 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
19a30 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
19a40 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
19a50 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
19a60 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
19a70 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
19a80 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
19a90 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
19aa0 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
19ab0 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
19ac0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
19ad0 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
19ae0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
19af0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
19b00 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
19b10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
19b20 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
19b30 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
19b40 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
19b50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
19b60 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
19b70 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
19b80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
19b90 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
19ba0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
19bb0 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
19bc0 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
19bd0 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
19be0 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
19bf0 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
19c00 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
19c10 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
19c20 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c60 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
19c70 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
19c80 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
19cc0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
19cd0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d00 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c         \.    sql
19d10 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
19d20 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
19d30 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
19d40 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
19d50 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43  >info); \.    pC
19d60 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
19d70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 7d 65 6c           \.  }el
19db0 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20 20            \.    
19e00 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
19e10 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 7d             \.  }
19e50 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
19e60 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  VER */../*.** Se
19e70 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
19e80 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
19e90 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
19ea0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
19eb0 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
19ec0 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
19ed0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
19ee0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
19ef0 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
19f00 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
19f10 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
19f20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
19f30 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
19f40 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
19f50 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
19f60 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
19f70 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
19f80 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
19f90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19fa0 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
19fb0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
19fc0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
19fd0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
19fe0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19ff0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1a000 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
1a010 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1a020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a030 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a040 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a050 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
1a060 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a070 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a080 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1a090 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1a0a0 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69  ID ){.      *pSi
1a0b0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
1a0c0 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
1a0d0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1a0e0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1a0f0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
1a100 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1a110 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
1a120 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
1a130 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1a140 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
1a150 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
1a160 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1a170 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65  s to.  Always re
1a180 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
1a190 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f  ** Failure is no
1a1a0 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20  t possible.  If 
1a1b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1a1c0 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
1a1d0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e  ointing to an en
1a1e0 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20 68  try (which can h
1a1f0 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70  appen, for examp
1a200 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61  le, if.** the da
1a210 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 29  tabase is empty)
1a220 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20   then *pSize is 
1a230 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74  set to 0..*/.int
1a240 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
1a250 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  aSize(BtCursor *
1a260 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65  pCur, u32 *pSize
1a270 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1a280 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1a290 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1a2a0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1a2b0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1a2c0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1a2d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a2e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1a2f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1a300 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
1a310 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1a320 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
1a330 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a340 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1a350 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
1a360 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
1a370 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
1a380 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
1a390 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
1a3a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
1a3b0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1a3c0 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
1a3d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
1a3e0 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
1a3f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a400 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
1a410 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
1a420 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1a430 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
1a440 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
1a450 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1a460 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
1a470 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1a480 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
1a490 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
1a4a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1a4b0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
1a4c0 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
1a4d0 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
1a4e0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
1a4f0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
1a500 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
1a510 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
1a520 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1a530 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
1a540 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1a550 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1a560 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
1a570 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1a580 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
1a590 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1a5a0 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
1a5b0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
1a5c0 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
1a5d0 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
1a5e0 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
1a5f0 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
1a600 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
1a610 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
1a620 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
1a630 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
1a640 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
1a650 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
1a660 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
1a670 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
1a680 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
1a690 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
1a6a0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1a6b0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
1a6c0 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
1a6d0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1a6e0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
1a6f0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
1a700 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
1a710 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
1a720 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
1a730 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
1a740 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
1a750 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
1a760 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
1a770 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
1a780 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
1a790 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
1a7a0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
1a7b0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
1a7c0 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
1a7d0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
1a7e0 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a800 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  Overflow page */
1a810 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1a820 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
1a830 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
1a840 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
1a850 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
1a860 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
1a870 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1a880 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1a890 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
1a8a0 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
1a8b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a8c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1a8d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1a8e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a8f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1a900 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1a910 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
1a920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a930 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1a940 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
1a950 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1a960 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1a970 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
1a980 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
1a990 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
1a9a0 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
1a9b0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
1a9c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1a9d0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
1a9e0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
1a9f0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
1aa00 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
1aa10 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
1aa20 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
1aa30 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
1aa40 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
1aa50 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1aa60 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
1aa70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1aa80 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1aa90 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
1aaa0 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
1aab0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
1aac0 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
1aad0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1aae0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
1aaf0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
1ab00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1ab10 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
1ab20 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
1ab30 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50  ( iGuess<=pagerP
1ab40 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
1ab50 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1ab60 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
1ab70 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
1ab80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1ab90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
1aba0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1abb0 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
1abc0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
1abd0 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
1abe0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1abf0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
1ac00 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1ac10 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1ac20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1ac30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1ac40 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
1ac50 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   &pPage, 0);.   
1ac60 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49   assert(rc==SQLI
1ac70 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
1ac80 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  0);.    if( next
1ac90 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
1aca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
1acb0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
1acc0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1acd0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
1ace0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
1acf0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
1ad00 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
1ad10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1ad20 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1ad30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ad40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1ad50 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
1ad60 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
1ad70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
1ad80 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
1ad90 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
1ada0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
1adb0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
1adc0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
1add0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
1ade0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
1adf0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1ae00 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
1ae10 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
1ae20 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1ae30 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
1ae40 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
1ae50 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
1ae60 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
1ae70 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
1ae80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1ae90 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
1aea0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
1aeb0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
1aec0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
1aed0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1aee0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
1aef0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1af00 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1af10 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
1af20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1af30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
1af40 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
1af50 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
1af60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1af70 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
1af80 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1afa0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
1afb0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
1afc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1afd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1afe0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
1aff0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
1b000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1b010 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
1b020 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
1b030 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
1b040 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
1b050 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
1b060 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
1b070 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
1b080 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
1b090 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
1b0a0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
1b0b0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1b0c0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1b0d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
1b0e0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1b0f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b100 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1b110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
1b120 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
1b130 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
1b140 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
1b150 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
1b160 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
1b170 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1b180 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
1b190 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
1b1a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1b1b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b1c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b1d0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
1b1e0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
1b1f0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
1b200 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
1b210 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
1b220 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1b230 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
1b240 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
1b250 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
1b260 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
1b270 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
1b280 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1b290 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
1b2a0 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
1b2b0 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
1b2c0 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
1b2d0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
1b2e0 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
1b2f0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1b300 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
1b310 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
1b320 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
1b330 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1b340 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  uf..**.** This r
1b350 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
1b360 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69  make a distincti
1b370 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61  on between key a
1b380 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a  nd data..** It j
1b390 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69  ust reads or wri
1b3a0 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  tes bytes from t
1b3b0 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
1b3c0 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a    Data might .**
1b3d0 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
1b3e0 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73  ain page or be s
1b3f0 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
1b400 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
1b410 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a  w .** pages..**.
1b420 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
1b430 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
1b440 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
1b450 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
1b460 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
1b470 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
1b480 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1b490 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
1b4a0 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
1b4b0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
1b4c0 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
1b4d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1b4e0 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
1b4f0 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
1b500 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
1b510 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
1b520 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
1b530 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
1b540 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
1b550 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
1b560 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
1b570 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1b580 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
1b590 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
1b5a0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
1b5b0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
1b5c0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
1b5d0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
1b5e0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
1b5f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
1b600 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
1b610 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
1b620 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
1b630 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
1b640 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
1b650 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
1b660 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1b670 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
1b680 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
1b690 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
1b6a0 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
1b6b0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
1b6c0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
1b6d0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
1b6e0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
1b6f0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
1b700 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
1b710 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
1b720 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
1b730 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
1b740 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1b750 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
1b760 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
1b770 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
1b780 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
1b790 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
1b7a0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
1b7b0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
1b7c0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
1b7d0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
1b7e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
1b7f0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
1b800 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
1b810 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
1b820 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20  t skipKey,      
1b830 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67     /* offset beg
1b840 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74  ins at data if t
1b850 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  his is true */. 
1b860 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
1b870 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
1b880 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
1b890 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
1b8a0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1b8b0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
1b8c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b8d0 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
1b8e0 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
1b8f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1b900 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1b910 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
1b920 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
1b930 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
1b940 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1b950 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
1b960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1b970 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
1b980 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
1b990 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
1b9a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1b9b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1b9c0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1b9d0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1b9e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1b9f0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
1ba00 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1ba10 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1ba20 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
1ba30 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
1ba40 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1ba50 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
1ba60 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
1ba70 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
1ba80 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
1ba90 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
1baa0 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
1bab0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  {.    offset += 
1bac0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
1bad0 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65  offset+amt > nKe
1bae0 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  y+pCur->info.nDa
1baf0 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c  ta .   || &aPayl
1bb00 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
1bb10 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
1bb20 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
1bb30 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20  leSize].  ){.   
1bb40 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
1bb50 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
1bb60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1bb70 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
1bb80 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1bb90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1bba0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
1bbb0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
1bbc0 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
1bbd0 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
1bbe0 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
1bbf0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1bc00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1bc10 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
1bc20 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
1bc30 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
1bc40 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1bc50 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
1bc60 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
1bc70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1bc80 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1bc90 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
1bca0 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
1bcb0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1bcc0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1bcd0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1bce0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
1bcf0 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
1bd00 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
1bd10 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
1bd20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bd30 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
1bd40 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
1bd50 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
1bd60 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
1bd70 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
1bd80 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
1bd90 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
1bda0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
1bdb0 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
1bdc0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1bdd0 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
1bde0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1bdf0 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
1be00 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
1be10 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
1be20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
1be30 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
1be40 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
1be50 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
1be60 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
1be70 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
1be80 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
1be90 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
1bea0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1beb0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1bec0 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
1bed0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1bee0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
1bef0 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1bf00 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
1bf10 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
1bf20 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
1bf30 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
1bf40 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
1bf50 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
1bf60 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
1bf70 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
1bf80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1bf90 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
1bfa0 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
1bfb0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1bfc0 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
1bfd0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
1bfe0 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
1bff0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
1c000 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
1c010 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1c020 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
1c030 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
1c040 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
1c050 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
1c060 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  l && !pCur->aOve
1c070 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
1c080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1c090 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1c0a0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1c0b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1c0c0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
1c0d0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
1c0e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
1c0f0 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
1c100 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
1c110 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
1c120 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
1c130 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
1c140 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
1c150 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
1c160 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
1c170 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
1c180 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
1c190 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
1c1a0 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
1c1b0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
1c1c0 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
1c1d0 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
1c1e0 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
1c1f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
1c200 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
1c210 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
1c220 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
1c230 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
1c240 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1c250 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
1c260 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
1c270 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1c280 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
1c290 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
1c2a0 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
1c2b0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
1c2c0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1c2d0 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
1c2e0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
1c2f0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1c300 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1c310 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
1c320 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
1c330 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
1c340 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
1c350 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1c360 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
1c370 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
1c380 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
1c390 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
1c3a0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
1c3b0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1c3c0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
1c3d0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1c3e0 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
1c3f0 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
1c400 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
1c410 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
1c420 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
1c430 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
1c440 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
1c450 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
1c460 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
1c470 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
1c480 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
1c490 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1c4a0 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
1c4b0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1c4c0 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
1c4d0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
1c4e0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
1c4f0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
1c500 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
1c510 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
1c520 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
1c530 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
1c540 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
1c550 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
1c560 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
1c570 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
1c580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c590 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
1c5a0 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
1c5b0 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
1c5c0 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
1c5d0 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
1c5e0 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
1c5f0 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
1c600 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
1c610 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
1c620 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
1c630 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
1c640 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
1c650 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1c660 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1c670 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
1c680 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
1c690 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1c6a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c6b0 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
1c6c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1c6d0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
1c6e0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
1c6f0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
1c700 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
1c710 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
1c720 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
1c730 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
1c740 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
1c750 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
1c760 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
1c770 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
1c780 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
1c790 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
1c7a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1c7b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1c7c0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
1c7d0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
1c7e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
1c7f0 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
1c800 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
1c810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c820 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c840 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
1c850 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1c860 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
1c870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c880 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
1c890 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
1c8a0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
1c8b0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
1c8c0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
1c8d0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
1c8e0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
1c8f0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
1c900 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
1c910 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
1c920 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1c930 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
1c940 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
1c950 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
1c960 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
1c970 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
1c980 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
1c990 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
1c9a0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
1c9b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c9c0 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
1c9d0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
1c9e0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
1c9f0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
1ca00 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
1ca10 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ca20 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1ca30 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1ca40 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1ca50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ca60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ca70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1ca80 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1ca90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1caa0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1cab0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1cac0 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  age] );.    if( 
1cad0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
1cae0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1caf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1cb00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1cb10 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1cb20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1cb30 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1cb40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1cb50 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1cb60 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
1cb70 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1cb80 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
1cb90 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30  char*)pBuf, 0, 0
1cba0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1cbb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
1cbc0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
1cbd0 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
1cbe0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
1cbf0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
1cc00 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
1cc10 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
1cc20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
1cc30 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
1cc40 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
1cc50 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1cc60 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
1cc70 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
1cc80 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1cc90 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
1cca0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1ccb0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
1ccc0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
1ccd0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
1cce0 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
1ccf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
1cd00 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
1cd10 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
1cd20 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
1cd30 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
1cd40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cd50 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
1cd60 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
1cd70 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1cd80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1cd90 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
1cda0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1cdb0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1cdc0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1cdd0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1cde0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1cdf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ce00 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1ce10 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1ce20 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1ce30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1ce40 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
1ce50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1ce60 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
1ce70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1ce80 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1ce90 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
1cea0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1ceb0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
1cec0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
1ced0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
1cee0 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  Buf, 1, 0);.  }.
1cef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cf00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1cf10 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
1cf20 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
1cf30 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
1cf40 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
1cf50 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1cf60 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
1cf70 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
1cf80 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
1cf90 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
1cfa0 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
1cfb0 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
1cfc0 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
1cfd0 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
1cfe0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1cff0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
1d000 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
1d010 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
1d020 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
1d030 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
1d040 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
1d050 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
1d060 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
1d070 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
1d080 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
1d090 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
1d0a0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
1d0b0 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
1d0c0 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
1d0d0 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
1d0e0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
1d0f0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
1d100 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
1d110 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
1d120 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
1d130 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
1d140 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
1d150 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
1d160 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
1d170 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
1d180 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
1d190 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
1d1a0 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
1d1b0 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
1d1c0 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
1d1d0 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
1d1e0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
1d1f0 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
1d200 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
1d210 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
1d220 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
1d230 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
1d240 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
1d250 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
1d260 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
1d270 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
1d280 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
1d290 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
1d2a0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
1d2b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
1d2c0 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
1d2d0 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
1d2e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1d2f0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1d300 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1d310 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
1d320 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
1d330 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1d340 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1d350 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
1d360 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
1d370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
1d380 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
1d390 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
1d3a0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
1d3b0 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
1d3c0 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
1d3d0 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
1d3e0 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b  y;.  u32 nLocal;
1d3f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
1d400 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
1d410 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1d420 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1d430 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
1d440 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1d450 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1d460 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1d470 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1d480 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1d490 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1d4a0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
1d4b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1d4c0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1d4d0 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
1d4e0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1d4f0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1d500 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
1d510 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
1d520 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1d530 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1d540 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
1d550 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1d560 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75   nKey = (int)pCu
1d570 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1d580 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
1d590 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
1d5a0 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
1d5b0 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1d5c0 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
1d5d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
1d5e0 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1d5f0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
1d600 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
1d610 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
1d620 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
1d630 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
1d640 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
1d650 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
1d660 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
1d670 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
1d680 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
1d690 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
1d6a0 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
1d6b0 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
1d6c0 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
1d6d0 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
1d6e0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
1d6f0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1d700 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
1d710 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
1d720 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
1d730 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
1d740 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
1d750 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
1d760 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
1d770 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
1d780 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
1d790 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
1d7a0 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
1d7b0 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
1d7c0 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
1d7d0 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
1d7e0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
1d7f0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
1d800 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
1d810 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1d820 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1d830 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
1d840 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
1d850 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
1d860 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
1d870 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
1d880 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
1d890 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
1d8a0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
1d8b0 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
1d8c0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1d8d0 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
1d8e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1d8f0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1d900 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1d910 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d920 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d930 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
1d940 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d950 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
1d960 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
1d970 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1d980 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
1d990 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1d9a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
1d9b0 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
1d9c0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
1d9d0 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
1d9e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d9f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1da00 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1da10 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1da20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1da30 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
1da40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1da50 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1da60 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
1da70 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
1da80 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
1da90 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
1daa0 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   0;.}.../*.** Mo
1dab0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1dac0 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
1dad0 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
1dae0 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
1daf0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
1db00 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
1db10 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
1db20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1db30 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
1db40 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1db50 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
1db60 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
1db70 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
1db80 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
1db90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1dba0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
1dbb0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1dbc0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1dbd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1dbe0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1dbf0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1dc00 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
1dc10 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
1dc20 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  TH );.  if( pCur
1dc30 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
1dc40 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
1dc50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1dc60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1dc70 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
1dc80 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1dc90 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
1dca0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1dcb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
1dcc0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d  Cur->apPage[i+1]
1dcd0 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
1dce0 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20  Cur->aiIdx[i+1] 
1dcf0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  = 0;.  pCur->iPa
1dd00 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ge++;..  pCur->i
1dd10 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1dd20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1dd30 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77   = 0;.  if( pNew
1dd40 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b  Page->nCell<1 ){
1dd50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1dd60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1dd70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1dd80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
1dd90 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
1dda0 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
1ddb0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
1ddc0 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
1ddd0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1dde0 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
1ddf0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
1de00 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
1de10 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
1de20 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
1de30 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
1de40 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
1de50 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
1de60 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
1de70 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
1de80 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
1de90 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
1dea0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
1deb0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
1dec0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1ded0 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
1dee0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
1def0 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
1df00 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ild){.  assert( 
1df10 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
1df20 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
1df30 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
1df40 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
1df50 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
1df60 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
1df70 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
1df80 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
1df90 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1dfa0 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
1dfb0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
1dfc0 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
1dfd0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
1dfe0 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
1dff0 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
1e000 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
1e010 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
1e020 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
1e030 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
1e040 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
1e050 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
1e060 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
1e070 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
1e080 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
1e090 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
1e0a0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
1e0b0 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
1e0c0 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
1e0d0 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
1e0e0 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
1e0f0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
1e100 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
1e110 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1e120 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1e130 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e140 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1e150 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e160 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1e170 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e180 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e190 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
1e1a0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
1e1b0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1e1c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1e1d0 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
1e1e0 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
1e1f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e200 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
1e210 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1e220 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
1e230 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1e240 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b  Page]->pgno.  );
1e250 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1e260 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e270 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75  ->iPage]);.  pCu
1e280 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43  r->iPage--;.  pC
1e290 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1e2a0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1e2b0 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  dNKey = 0;.}../*
1e2c0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1e2d0 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  sor to the root 
1e2e0 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  page.*/.static i
1e2f0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
1e300 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e310 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
1e320 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e330 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a  TE_OK;.  Btree *
1e340 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
1e350 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1e360 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
1e370 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1e380 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1e390 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1e3a0 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
1e3b0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1e3c0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
1e3d0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
1e3e0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1e3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1e400 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
1e410 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1e420 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1e430 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
1e440 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
1e450 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1e460 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
1e470 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e480 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20   pCur->skip;.   
1e490 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1e4a0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1e4b0 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
1e4c0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1e4d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1e4e0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43    for(i=1; i<=pC
1e4f0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1e500 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1e510 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
1e520 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  i]);.    }.  }el
1e530 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20  se{.    if( .   
1e540 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
1e550 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1e560 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
1e570 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
1e580 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29  pPage[0])).    )
1e590 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
1e5a0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1e5b0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
1e5c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e5d0 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  }..  pRoot = pCu
1e5e0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
1e5f0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
1e600 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
1e610 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  oot );.  pCur->i
1e620 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Page = 0;.  pCur
1e630 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
1e640 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1e650 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1e660 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43  atLast = 0;.  pC
1e670 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1e680 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  0;..  if( pRoot-
1e690 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
1e6a0 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
1e6b0 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
1e6c0 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
1e6d0 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
1e6e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e6f0 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
1e700 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pRoot->pgno==1 )
1e710 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
1e720 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
1e730 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
1e740 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1e750 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65   assert( subpage
1e760 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 );.    pCur->
1e770 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1e780 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
1e790 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1e7a0 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
1e7b0 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
1e7c0 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d  State = ((pRoot-
1e7d0 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52  >nCell>0)?CURSOR
1e7e0 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e  _VALID:CURSOR_IN
1e7f0 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65  VALID);.  }.  re
1e800 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e810 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1e820 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
1e830 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
1e840 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1e850 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
1e860 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
1e870 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
1e880 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
1e890 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
1e8a0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
1e8b0 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
1e8c0 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
1e8d0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
1e8e0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
1e8f0 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
1e900 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
1e910 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
1e920 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
1e930 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1e940 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e950 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e960 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e970 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e980 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
1e990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1e9a0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
1e9b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1e9c0 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
1e9d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1e9e0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1e9f0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1ea00 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
1ea10 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1ea20 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
1ea30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1ea40 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
1ea50 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1ea60 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
1ea70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ea80 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1ea90 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
1eaa0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
1eab0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1eac0 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
1ead0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
1eae0 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
1eaf0 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
1eb00 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
1eb10 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
1eb20 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1eb30 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
1eb40 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1eb50 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
1eb60 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
1eb70 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
1eb80 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
1eb90 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
1eba0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
1ebb0 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
1ebc0 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
1ebd0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
1ebe0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
1ebf0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
1ec00 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
1ec10 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
1ec20 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1ec30 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
1ec40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1ec50 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
1ec60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ec70 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
1ec80 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
1ec90 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1eca0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1ecb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ecc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ecd0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1ece0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ecf0 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
1ed00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ed10 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
1ed20 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1ed30 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1ed40 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1ed50 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
1ed60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1ed70 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
1ed80 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
1ed90 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1eda0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
1edb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1edc0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
1edd0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1ede0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1edf0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1ee00 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1ee10 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1ee20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1ee30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1ee40 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1ee50 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1ee60 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1ee70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1ee80 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1ee90 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1eea0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1eeb0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1eec0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1eed0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1eee0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1eef0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1ef00 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1ef10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1ef20 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1ef30 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1ef40 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1ef50 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1ef60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1ef70 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1ef80 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1ef90 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1efa0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1efb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1efc0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1efd0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1efe0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1eff0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1f000 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f010 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
1f020 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1f030 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f040 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1f050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f060 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1f070 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
1f080 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1f090 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1f0a0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1f0b0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1f0c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f0d0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1f0e0 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
1f0f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1f100 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1f110 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1f120 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1f130 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1f140 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1f150 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1f160 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1f170 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1f180 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1f190 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
1f1a0 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
1f1b0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1f1c0 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
1f1d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1f1e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1f1f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f200 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1f210 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1f220 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
1f230 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72  f the cursor alr
1f240 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  eady points to t
1f250 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74  he last entry, t
1f260 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  his is a no-op. 
1f270 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  */.  if( CURSOR_
1f280 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1f290 61 74 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c  ate && pCur->atL
1f2a0 61 73 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ast ){.#ifdef SQ
1f2b0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1f2c0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  * This block ser
1f2d0 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ves to assert() 
1f2e0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1f2f0 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e  really does poin
1f300 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  t .    ** to the
1f310 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
1f320 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20  he b-tree. */.  
1f330 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
1f340 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d  r(ii=0; ii<pCur-
1f350 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  >iPage; ii++){. 
1f360 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1f370 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43  r->aiIdx[ii]==pC
1f380 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e  ur->apPage[ii]->
1f390 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20  nCell );.    }. 
1f3a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1f3b0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1f3c0 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]==pCur->apPag
1f3d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1f3e0 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
1f3f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1f400 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f410 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
1f420 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f430 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
1f440 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1f450 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1f460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f470 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1f480 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1f490 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1f4a0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1f4b0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1f4c0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
1f4d0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
1f4e0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1f4f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1f500 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1f510 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1f520 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1f530 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
1f540 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  r);.      pCur->
1f550 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c  atLast = rc==SQL
1f560 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20  ITE_OK ?1:0;.   
1f570 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f580 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1f590 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
1f5a0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
1f5b0 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
1f5c0 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
1f5d0 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
1f5e0 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
1f5f0 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
1f600 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
1f610 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
1f620 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
1f630 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
1f640 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
1f650 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
1f660 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
1f670 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
1f680 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
1f690 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
1f6a0 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
1f6b0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
1f6c0 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
1f6d0 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
1f6e0 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
1f6f0 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
1f700 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
1f710 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
1f720 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
1f730 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
1f740 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
1f750 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
1f760 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
1f770 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
1f780 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
1f790 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
1f7a0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
1f7b0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
1f7c0 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
1f7d0 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
1f7e0 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
1f7f0 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
1f800 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
1f810 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
1f820 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
1f830 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
1f840 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
1f850 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1f860 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1f870 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1f890 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
1f8a0 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
1f8b0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1f8c0 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
1f8d0 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
1f8e0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
1f8f0 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
1f900 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
1f910 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
1f920 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1f930 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1f940 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1f950 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1f960 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
1f970 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
1f980 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
1f990 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
1f9a0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
1f9b0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1f9c0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
1f9e0 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
1f9f0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
1fa00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1fa10 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
1fa20 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1fa30 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
1fa40 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
1fa50 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
1fa60 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
1fa70 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
1fa80 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
1fa90 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
1faa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fab0 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
1fac0 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
1fad0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1fae0 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
1faf0 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
1fb00 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
1fb10 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
1fb20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
1fb30 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
1fb40 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  /.){.  int rc;..
1fb50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1fb60 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1fb70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1fb80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1fb90 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1fba0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
1fbb0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
1fbc0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
1fbd0 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
1fbe0 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
1fbf0 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
1fc00 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
1fc10 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
1fc20 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
1fc30 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1fc40 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
1fc50 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65  & pCur->validNKe
1fc60 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61  y .   && pCur->a
1fc70 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
1fc80 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
1fc90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
1fca0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1fcb0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1fcc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fcd0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
1fce0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26   pCur->atLast &&
1fcf0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1fd00 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
1fd10 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
1fd20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fd30 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1fd40 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
1fd50 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
1fd60 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1fd70 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
1fd80 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1fd90 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1fda0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1fdb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1fdc0 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  e]->isInit );.  
1fdd0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1fde0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1fdf0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1fe00 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
1fe10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fe20 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1fe30 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
1fe40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1fe50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1fe60 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
1fe70 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
1fe80 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
1fe90 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20  int lwr, upr;.  
1fea0 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
1feb0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1fec0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1fed0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1fee0 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20     int c = -1;  
1fef0 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20 69  /* pRes return i
1ff00 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  f table is empty
1ff10 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20   must be -1 */. 
1ff20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
1ff30 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
1ff40 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 28 21  ll-1;.    if( (!
1ff50 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1ff60 20 70 49 64 78 4b 65 79 3d 3d 30 29 20 7c 7c 20   pIdxKey==0) || 
1ff70 75 70 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  upr<0 ){.      r
1ff80 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1ff90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
1ffa0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1ffb0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  h;.    }.    if(
1ffc0 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
1ffd0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1ffe0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
1fff0 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c  u16)upr;.    }el
20000 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  se{.      pCur->
20010 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
20020 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b  e] = (u16)((upr+
20030 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  lwr)/2);.    }. 
20040 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
20050 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
20060 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20070 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f  age]; /* Index o
20080 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  f current cell i
20090 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20  n pPage */.     
200a0 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
200d0 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
200e0 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
200f0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
20100 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ize = 0;.      p
20110 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
20120 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
20130 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
20140 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  e;.      if( pPa
20150 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
20160 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
20170 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
20180 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
20190 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
201a0 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  dummy;.         
201b0 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72   pCell += getVar
201c0 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d  int32(pCell, dum
201d0 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  my);.        }. 
201e0 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
201f0 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
20200 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
20210 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d    if( nCellKey==
20220 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
20230 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
20240 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
20250 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
20260 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
20270 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
20280 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
20290 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  t( nCellKey>intK
202a0 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
202b0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
202c0 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  }.        pCur->
202d0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
202e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
202f0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
20300 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
20310 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
20320 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
20330 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32   page-size is 32
20340 37 36 38 20 62 79 74 65 73 2e 20 54 68 69 73 20  768 bytes. This 
20350 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
20360 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
20370 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
20380 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
20390 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
203a0 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
203b0 67 65 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31  ge is at most 81
203c0 39 38 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  98 bytes, which 
203d0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
203e0 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
203f0 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
20400 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
20410 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
20420 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
20430 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
20440 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
20450 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
20460 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
20470 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
20480 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
20490 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
204a0 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
204b0 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
204c0 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
204d0 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
204e0 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
204f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  */.        int n
20500 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
20510 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28 6e  .        if( !(n
20520 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20  Cell & 0x80) && 
20530 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
20540 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
20550 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
20560 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
20570 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
20580 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
20590 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
205a0 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
205b0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
205c0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
205d0 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
205e0 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
205f0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
20600 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
20610 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
20620 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
20630 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
20640 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
20650 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
20660 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
20670 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
20680 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
20690 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
206a0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
206b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
206c0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
206d0 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
206e0 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
206f0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
20700 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
20710 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
20720 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
20730 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
20740 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
20750 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
20760 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
20770 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
20780 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
20790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
207a0 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
207b0 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
207c0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
207d0 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
207e0 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
207f0 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
20800 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
20810 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
20820 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
20830 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
20840 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
20850 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
20860 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
20870 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
20880 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
20890 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
208a0 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20  called. */.     
208b0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
208c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
208d0 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
208e0 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
208f0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
20900 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e;.          sql
20910 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
20920 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
20930 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
20940 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
20950 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
20960 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
20970 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
20980 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
20990 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ( nCell );.     
209a0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
209b0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
209c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
209d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
209e0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
209f0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
20a00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
20a10 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
20a20 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
20a30 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
20a40 70 43 65 6c 6c 4b 65 79 2c 20 30 2c 20 30 29 3b  pCellKey, 0, 0);
20a50 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
20a60 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20a70 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
20a80 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
20a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
20aa0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
20ab0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
20ac0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
20ad0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
20ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20af0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
20b00 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
20b10 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
20b20 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
20b30 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
20b40 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  ;.          upr 
20b50 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20  = lwr - 1;.     
20b60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20b70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b80 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
20b90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
20ba0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
20bb0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
20bc0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
20bd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
20be0 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
20bf0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
20c00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20c10 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
20c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20c30 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20  if( lwr>upr ){. 
20c40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20c50 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
20c60 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20c70 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 6c 77  age] = (u16)((lw
20c80 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+upr)/2);.    }
20c90 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
20ca0 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61  ==upr+1 );.    a
20cb0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
20cc0 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
20cd0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
20ce0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b       chldPg = 0;
20cf0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
20d00 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
20d10 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
20d20 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
20d30 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
20d40 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
20d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20d60 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
20d70 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
20d80 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
20d90 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d      if( chldPg==
20da0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
20db0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
20dc0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
20dd0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
20de0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
20df0 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
20e00 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
20e10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
20e20 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
20e30 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
20e40 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
20e50 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
20e60 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70   (u16)lwr;.    p
20e70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
20e80 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
20e90 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
20ea0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
20eb0 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
20ec0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
20ed0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
20ee0 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  h;.  }.moveto_fi
20ef0 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72  nish:.  return r
20f00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  c;.}../*.** In t
20f10 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
20f20 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
20f30 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
20f40 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
20f50 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
20f60 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
20f70 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
20f80 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
20f90 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
20fa0 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
20fb0 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
20fc0 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20  he work..*/.int 
20fd0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
20fe0 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
20ff0 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
21000 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
21010 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
21020 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
21030 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
21040 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
21050 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
21060 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
21070 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
21080 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
21090 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
210a0 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
210b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
210c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
210d0 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
210e0 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
210f0 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
21100 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
21110 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
21120 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
21150 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
21160 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
21170 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
21180 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68  ndex key */.  ch
21190 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d 3b 20  ar aSpace[150]; 
211a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
211b0 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b   space for pIdxK
211c0 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ey - to avoid a 
211d0 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 0a 20 20 69 66  malloc */...  if
211e0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
211f0 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
21200 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
21210 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
21220 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
21230 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
21240 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
21250 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61 63             aSpac
21280 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65  e, sizeof(aSpace
21290 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  ));.    if( pIdx
212a0 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
212b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
212c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
212d0 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
212e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
212f0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
21300 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
21310 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
21320 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
21330 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
21340 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
21350 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a  d(pIdxKey);.  }.
21360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21370 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
21380 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
21390 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
213a0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
213b0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
213c0 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
213d0 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
213e0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
213f0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
21400 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
21410 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
21420 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
21430 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
21440 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
21450 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
21460 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
21470 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
21480 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
21490 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
214a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
214b0 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
214c0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
214d0 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
214e0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
214f0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
21500 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
21510 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
21520 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
21530 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
21540 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
21550 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
21560 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
21570 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
21580 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
21590 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
215a0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
215b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
215c0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
215d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
215e0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
215f0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
21600 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
21610 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
21620 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
21630 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
21640 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
21650 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
21660 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
21670 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
21680 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21690 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
216a0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
216b0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
216c0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
216d0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
216e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
216f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
21700 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
21710 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
21720 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
21730 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
21740 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
21750 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
21760 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  );.  if( CURSOR_
21770 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
21780 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
21790 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
217a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
217b0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
217c0 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip>0 ){.    pCur
217d0 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
217e0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
217f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21800 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
21810 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  p = 0;..  pPage 
21820 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21830 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
21840 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
21850 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
21860 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21870 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
21880 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65  sert( idx<=pPage
21890 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43  ->nCell );..  pC
218a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
218b0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
218c0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
218d0 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
218e0 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
218f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
21900 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
21910 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
21920 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
21930 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
21940 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
21950 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
21960 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  c;.      rc = mo
21970 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
21980 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  r);.      *pRes 
21990 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
219a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
219b0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
219c0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
219d0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
219e0 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
219f0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
21a00 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
21a10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21a20 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
21a30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
21a40 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
21a50 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
21a60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21a70 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
21a80 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
21a90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
21aa0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
21ab0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
21ac0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
21ad0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
21ae0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
21af0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
21b00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21b10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21b20 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
21b30 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
21b40 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
21b50 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
21b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21b70 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
21b80 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
21b90 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
21ba0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
21bb0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
21bc0 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
21bd0 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
21be0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
21bf0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
21c00 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
21c10 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
21c20 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
21c30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
21c40 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
21c50 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
21c60 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
21c70 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
21c80 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
21c90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21ca0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
21cb0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
21cc0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
21cd0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
21ce0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
21cf0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21d00 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
21d10 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
21d20 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
21d30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21d40 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
21d50 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
21d60 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69  >atLast = 0;.  i
21d70 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
21d80 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
21d90 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
21da0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21db0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
21dc0 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29  ( pCur->skip<0 )
21dd0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
21de0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
21df0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
21e00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21e10 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
21e20 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
21e30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21e40 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
21e50 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
21e60 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
21e70 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
21e80 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
21e90 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
21ea0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
21eb0 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
21ec0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
21ed0 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
21ee0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
21ef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
21f00 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
21f10 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
21f20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
21f30 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
21f40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
21f50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
21f60 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
21f70 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
21f80 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
21f90 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
21fa0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
21fb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21fc0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
21fd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
21fe0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
21ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
22000 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
22010 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
22020 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20  dNKey = 0;..    
22030 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22040 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
22050 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
22060 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22070 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
22080 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
22090 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
220a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
220b0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
220c0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
220d0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
220e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
220f0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
22100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22110 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
22120 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
22130 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22140 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
22150 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
22160 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
22170 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
22180 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
22190 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
221a0 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
221b0 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
221c0 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
221d0 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
221e0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
221f0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
22200 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
22210 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
22220 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
22230 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
22240 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
22250 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
22260 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
22270 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
22280 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
22290 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
222a0 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
222b0 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
222c0 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
222d0 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
222e0 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
222f0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
22300 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
22310 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
22320 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
22330 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
22340 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
22350 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
22360 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
22370 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
22380 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
22390 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
223a0 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
223b0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
223c0 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
223d0 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
223e0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
223f0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
22400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22410 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
22420 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
22430 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
22440 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
22450 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
22460 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
22470 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
22480 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
22490 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
224a0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
224b0 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
224c0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
224d0 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
224e0 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
224f0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
22500 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
22510 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
22520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
22530 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
22540 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
22550 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70   .  MemPage **pp
22560 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70  Page, .  Pgno *p
22570 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65  Pgno, .  Pgno ne
22580 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74  arby,.  u8 exact
22590 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
225a0 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
225b0 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
225c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
225d0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
225e0 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20   */.  int k;    
225f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
22600 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
22610 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
22620 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
22630 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
22640 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
22650 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
22660 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
22670 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
22680 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
22690 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
226a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
226b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
226c0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
226d0 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
226e0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
226f0 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  Bt);.  n = get4b
22700 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
22710 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
22720 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72  >mxPage ){.    r
22730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
22740 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
22750 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
22760 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
22770 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
22780 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
22790 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
227a0 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
227b0 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
227c0 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
227d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
227e0 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
227f0 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
22800 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68     .    /* If th
22810 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65  e 'exact' parame
22820 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64  ter was true and
22830 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
22840 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
22850 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
22860 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
22870 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
22880 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
22890 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
228a0 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
228b0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
228c0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
228d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
228e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
228f0 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26  .    if( exact &
22900 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65  & nearby<=mxPage
22910 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79   ){.      u8 eTy
22920 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pe;.      assert
22930 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
22940 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
22950 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
22960 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
22970 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
22980 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
22990 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
229a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28  rn rc;.      if(
229b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
229c0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
229d0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
229e0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
229f0 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79   *pPgno = nearby
22a00 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
22a10 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
22a20 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
22a30 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
22a40 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
22a50 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
22a60 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
22a70 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
22a80 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
22a90 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
22aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22ab0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
22ac0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
22ad0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
22ae0 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
22af0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
22b00 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
22b10 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
22b20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
22b30 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
22b40 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
22b50 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
22b60 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
22b70 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
22b80 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
22b90 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
22ba0 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
22bb0 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
22bc0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
22bd0 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cated..    */.  
22be0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
22bf0 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
22c00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
22c10 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
22c20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
22c30 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
22c40 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
22c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22c60 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
22c70 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
22c80 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
22c90 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
22ca0 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
22cb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
22cc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
22cd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
22cf0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
22d00 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
22d10 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
22d20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
22d30 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
22d40 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
22d50 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
22d60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
22d70 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
22d80 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
22d90 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
22da0 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
22db0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
22dc0 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
22dd0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
22de0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
22df0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
22e00 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
22e10 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
22e20 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
22e30 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
22e40 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
22e50 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
22e60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
22e70 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
22e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22e90 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
22ea0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
22eb0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
22ec0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
22ed0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
22ee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22ef0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
22f00 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
22f10 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
22f20 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
22f30 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
22f40 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
22f50 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
22f60 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
22f70 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
22f80 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
22f90 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
22fa0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
22fb0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
22fc0 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75  lse if( k>pBt->u
22fd0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
22fe0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
22ff0 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
23000 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
23010 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
23020 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
23030 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23040 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
23050 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
23060 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
23070 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
23080 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
23090 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26  f( searchList &&
230a0 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20   nearby==iTrunk 
230b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
230c0 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
230d0 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
230e0 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
230f0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
23100 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
23110 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
23120 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
23130 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
23140 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23150 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20   *pPgno==iTrunk 
23160 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
23170 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
23180 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
23190 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
231a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
231b0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
231c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
231d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
231e0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
231f0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
23200 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
23210 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
23220 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
23230 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
23240 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
23250 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
23260 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
23270 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
23280 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
23290 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
232a0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
232b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
232c0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
232d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
232e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
232f0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
23300 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
23310 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
23320 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
23330 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
23340 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
23350 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
23360 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
23370 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
23380 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
23390 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
233a0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
233b0 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
233c0 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
233d0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
233e0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
233f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
23400 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
23410 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
23420 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
23430 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
23440 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
23450 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
23460 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23470 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23480 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
23490 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
234a0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
234b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
234c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
234d0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
234e0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
234f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
23500 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
23510 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
23520 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
23530 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
23540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23560 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
23570 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
23580 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
23590 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
235a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
235b0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
235c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
235d0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
235e0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
235f0 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
23600 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
23610 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
23620 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
23630 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
23640 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
23650 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
23660 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
23670 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
23680 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
23690 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
236a0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
236b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
236c0 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
236d0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
236e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
236f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
23700 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
23710 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23720 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
23730 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23740 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
23750 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
23760 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
23770 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
23780 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
23790 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
237a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
237b0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
237c0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
237d0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
237e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
237f0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
23800 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
23810 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
23820 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
23830 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
23840 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
23850 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
23860 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  e{.        /* Ex
23870 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
23880 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
23890 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65         int close
238a0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
238b0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
238c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
238d0 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
238e0 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63  Data;.        rc
238f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23900 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
23910 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
23920 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
23930 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
23940 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
23950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
23960 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
23970 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69         int i, di
23980 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
23990 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
239a0 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34       dist = get4
239b0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
239c0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
239d0 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29      if( dist<0 )
239e0 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20   dist = -dist;. 
239f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
23a00 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
23a10 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
23a20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
23a30 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
23a40 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  by;.            
23a50 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20  if( d2<0 ) d2 = 
23a60 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -d2;.           
23a70 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
23a90 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
23aa0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
23ab0 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
23ac0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
23ad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23ae0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
23af0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
23b00 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
23b10 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
23b20 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
23b30 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
23b40 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
23b50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23b60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
23b70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
23b80 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
23b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ba0 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
23bb0 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72  t || iPage==near
23bc0 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
23bd0 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
23be0 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50           Pgno nP
23bf0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  age;.          *
23c00 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
23c10 20 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d           nPage =
23c20 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
23c30 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pBt);.          
23c40 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65  if( *pPgno>nPage
23c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23c60 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66  /* Free page off
23c70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23c80 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
23c90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23ca0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
23cb0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
23cc0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
23cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23ce0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
23cf0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
23d00 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
23d10 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
23d30 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
23d40 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
23d50 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
23d60 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
23d70 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
23d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23d90 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
23da0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
23db0 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
23dc0 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
23dd0 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
23de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23df0 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
23e00 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
23e10 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
23e20 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
23e30 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  able(pTrunk->pDb
23e40 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
23e50 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21     noContent = !
23e60 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
23e70 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b  nt(pBt, *pPgno);
23e80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23e90 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
23ea0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
23eb0 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
23ec0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
23ed0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23ef0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23f00 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
23f10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
23f20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
23f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23f40 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
23f50 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
23f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23f70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23f80 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
23f90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
23fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
23fb0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
23fc0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
23fd0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
23fe0 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
23ff0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
24000 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
24010 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
24020 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
24030 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
24040 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
24050 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
24060 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
24070 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
24080 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  Bt);.    *pPgno 
24090 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 20 20  = nPage + 1;..  
240a0 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
240b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
240c0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 28 2a  pBt) ){.      (*
240d0 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a  pPgno)++;.    }.
240e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
240f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
24100 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
24110 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
24120 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70  P_ISPAGE(pBt, *p
24130 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f  Pgno) ){.      /
24140 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
24150 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
24160 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
24170 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
24180 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
24190 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
241a0 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
241b0 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
241c0 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
241d0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
241e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
241f0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
24200 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
24210 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
24220 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
24230 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
24240 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
24250 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
24260 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
24270 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  age)\n", *pPgno)
24280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24290 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
242a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
242b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
242c0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
242d0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 26  e(pBt, *pPgno, &
242e0 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  pPg, 0);.      i
242f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24300 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
24310 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24320 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
24330 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
24340 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
24350 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
24360 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
24370 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
24380 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
24390 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
243a0 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50  AGE(pBt) ){ (*pP
243b0 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  gno)++; }.    }.
243c0 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65  #endif..    asse
243d0 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
243e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
243f0 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  t) );.    rc = s
24400 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
24410 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
24420 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
24430 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
24440 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
24450 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
24460 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
24470 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
24480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24490 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
244a0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
244b0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
244c0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
244d0 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
244e0 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
244f0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
24500 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
24510 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
24520 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
24530 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
24540 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
24550 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
24560 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24570 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
24580 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
24590 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
245a0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
245b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
245c0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
245d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
245e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
245f0 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
24600 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
24610 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
24620 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
24630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24640 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24650 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
24660 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
24670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
24680 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
24690 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
246a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
246b0 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
246c0 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
246d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
246e0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
246f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
24700 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
24710 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
24720 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
24730 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
24740 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24750 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
24760 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
24770 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
24780 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
24790 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
247a0 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
247b0 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
247c0 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
247d0 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
247e0 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
247f0 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
24800 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
24810 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
24820 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
24830 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
24840 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
24850 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
24860 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
24870 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
24880 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
24890 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
248a0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
248b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
248c0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
248d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
248e0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
248f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
24900 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
24910 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
24920 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
24930 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
24940 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
24950 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
24960 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
24970 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24990 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
249a0 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
249b0 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
249e0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
249f0 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a10 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
24a20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
24a30 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
24a40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24a50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
24a60 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
24a70 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b  sert( iPage>1 );
24a80 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
24a90 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
24aa0 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
24ab0 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ..  if( pMemPage
24ac0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
24ad0 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
24ae0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
24af0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
24b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
24b10 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
24b20 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
24b30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
24b40 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
24b50 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
24b60 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
24b70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24b80 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
24b90 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
24ba0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
24bb0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
24bc0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
24bd0 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
24be0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
24bf0 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
24c00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
24c10 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
24c20 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
24c30 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f  SECURE_DELETE co
24c40 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
24c50 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
24c60 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  en.  ** always f
24c70 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
24c80 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
24c90 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
24ca0 20 2a 2f 0a 20 20 69 66 28 20 28 21 70 50 61 67   */.  if( (!pPag
24cb0 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
24cc0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
24cd0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
24ce0 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c 20 20 20  e, 0))).   ||   
24cf0 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 73           (rc = s
24d00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24d10 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
24d20 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ).  ){.    goto 
24d30 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
24d40 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  }.  memset(pPage
24d50 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
24d60 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
24d70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
24d80 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
24d90 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
24da0 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
24db0 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
24dc0 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
24dd0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
24de0 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
24df0 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54    */.  if( ISAUT
24e00 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72  OVACUUM ){.    r
24e10 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
24e20 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
24e30 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
24e40 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
24e50 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
24e60 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e   }..  /* Now man
24e70 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75  ipulate the actu
24e80 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65  al database free
24e90 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  -list structure.
24ea0 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20   There are two. 
24eb0 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65   ** possibilitie
24ec0 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  s. If the free-l
24ed0 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ist is currently
24ee0 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68   empty, or if th
24ef0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75  e first.  ** tru
24f00 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
24f10 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
24f20 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
24f30 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20   will become a. 
24f40 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73   ** new free-lis
24f50 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74  t trunk page. Ot
24f60 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c  herwise, it will
24f70 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f   become a leaf o
24f80 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  f the.  ** first
24f90 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
24fa0 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d  he current free-
24fb0 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  list. This block
24fc0 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a   tests if it.  *
24fd0 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
24fe0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73   add the page as
24ff0 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74   a new free-list
25000 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66   leaf..  */.  if
25010 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20  ( nFree!=0 ){.  
25020 20 20 69 6e 74 20 6e 4c 65 61 66 3b 20 20 20 20    int nLeaf;    
25030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25040 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
25050 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74   leaf cells on t
25060 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20  runk page */..  
25070 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
25080 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
25090 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20  ta[32]);.    rc 
250a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
250b0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
250c0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
250d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
250e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
250f0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
25100 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
25110 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
25120 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
25130 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c  ;.    if( nLeaf<
25140 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
25150 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25160 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
25170 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
25180 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
25190 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  f<pBt->usableSiz
251a0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
251b0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
251c0 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
251d0 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
251e0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
251f0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
25200 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
25210 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
25220 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
25230 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
25240 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
25250 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
25260 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
25270 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
25280 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
25290 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
252a0 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
252b0 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
252c0 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
252d0 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
252e0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
252f0 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
25300 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
25310 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
25320 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
25330 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
25340 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
25350 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
25360 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
25370 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
25380 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
25390 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
253a0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
253b0 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
253c0 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
253d0 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
253e0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e   we will contain
253f0 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
25400 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
25410 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
25420 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
25430 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
25440 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
25450 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
25460 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
25470 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
25480 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
25490 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
254a0 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
254b0 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
254c0 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
254d0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
254e0 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
254f0 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
25500 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
25510 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25520 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
25530 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
25540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25550 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
25560 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
25570 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
25580 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
25590 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
255a0 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
255b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
255c0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
255d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
255e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
255f0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
25600 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
25610 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ge);.        }.#
25620 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63  endif.        rc
25630 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
25640 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
25650 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25660 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
25670 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
25680 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
25690 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
256a0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
256b0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
256c0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
256d0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
256e0 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
256f0 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
25700 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
25710 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
25720 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
25730 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
25740 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
25750 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
25760 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
25770 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
25780 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
25790 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
257a0 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
257b0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
257c0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
257d0 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
257e0 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
257f0 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
25800 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
25810 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
25820 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
25830 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
25840 20 20 20 28 28 21 70 50 61 67 65 29 20 26 26 20     ((!pPage) && 
25850 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
25860 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
25870 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
25880 67 65 2c 20 30 29 29 29 29 0a 20 20 20 20 20 7c  ge, 0)))).     |
25890 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
258a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
258b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
258c0 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ).  ){.    goto 
258d0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
258e0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
258f0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
25900 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
25910 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
25920 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
25930 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
25940 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
25950 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
25960 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
25970 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
25980 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
25990 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
259a0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
259b0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
259c0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
259d0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
259e0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
259f0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
25a00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25a10 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
25a20 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
25a30 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 72  ge){.  return fr
25a40 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
25a50 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
25a60 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pgno);.}../*.*
25a70 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
25a80 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
25a90 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
25aa0 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
25ab0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
25ac0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
25ad0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
25ae0 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
25af0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
25b00 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
25b10 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
25b20 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
25b30 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
25b40 20 20 75 31 36 20 6f 76 66 6c 50 61 67 65 53 69    u16 ovflPageSi
25b50 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
25b60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
25b70 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
25b80 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
25b90 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
25ba0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
25bb0 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
25bc0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
25bd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25be0 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
25bf0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
25c00 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
25c10 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
25c20 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
25c30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
25c40 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
25c50 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w]);.  assert( p
25c60 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e  Bt->usableSize >
25c70 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65   4 );.  ovflPage
25c80 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
25c90 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
25ca0 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
25cb0 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
25cc0 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
25cd0 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
25ce0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ize;.  assert( o
25cf0 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f  vflPgno==0 || nO
25d00 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vfl>0 );.  while
25d10 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
25d20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
25d30 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
25d40 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
25d50 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
25d60 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67  vflPgno>pagerPag
25d70 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
25d80 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
25d90 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
25da0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
25db0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
25dc0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
25dd0 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
25de0 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
25df0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
25e00 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
25e10 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
25e20 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
25e30 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
25e40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
25e50 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
25e60 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
25e70 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
25e80 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
25e90 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
25ea0 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
25eb0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
25ec0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
25ed0 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
25ee0 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
25ef0 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  );.    if( pOvfl
25f00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25f10 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
25f20 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
25f30 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
25f40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
25f50 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
25f60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
25f70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25f80 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
25f90 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
25fa0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
25fb0 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
25fc0 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
25fd0 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
25fe0 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
25ff0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
26000 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
26010 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
26020 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
26030 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
26040 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
26050 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
26060 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
26070 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
26080 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
26090 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
260a0 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
260b0 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
260c0 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
260d0 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
260e0 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
260f0 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
26100 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
26110 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
26120 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
26130 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
26140 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
26150 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
26160 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
26170 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
26180 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
26190 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
261a0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
261b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
261c0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
261d0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
261e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
261f0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
26200 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
26210 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
26220 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
26230 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
26240 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
26250 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
26260 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
26270 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
26280 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
262a0 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
262b0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
262c0 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
262d0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
262e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
262f0 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
26300 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
26310 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
26320 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
26330 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
26340 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
26350 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
26360 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
26370 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
26380 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
26390 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
263a0 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
263b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
263c0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
263d0 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
263e0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
263f0 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  er;.  CellInfo i
26400 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
26410 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
26420 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
26430 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
26440 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
26450 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
26460 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
26470 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
26480 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
26490 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
264a0 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
264b0 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
264c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
264d0 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
264e0 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
264f0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
26500 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
26510 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
26520 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
26530 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
26540 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
26550 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
26560 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66  Header = 0;.  if
26570 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
26580 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
26590 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   4;.  }.  if( pP
265a0 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
265b0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
265c0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
265d0 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b  nHeader], nData+
265e0 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  nZero);.  }else{
265f0 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65  .    nData = nZe
26600 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48  ro = 0;.  }.  nH
26610 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
26620 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
26630 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79  r], *(u64*)&nKey
26640 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
26650 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
26660 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
26670 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  o);.  assert( in
26680 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61  fo.nHeader==nHea
26690 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  der );.  assert(
266a0 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
266b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
266c0 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28  fo.nData==(u32)(
266d0 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a  nData+nZero) );.
266e0 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
266f0 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
26700 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
26710 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
26720 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
26730 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
26740 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
26750 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
26760 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
26770 20 20 20 69 66 28 20 6e 4b 65 79 3e 30 78 37 66     if( nKey>0x7f
26780 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d  ffffff || pKey==
26790 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
267a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
267b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
267c0 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65  load += (int)nKe
267d0 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
267e0 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28  ey;.    nSrc = (
267f0 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  int)nKey;.  }.  
26800 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
26810 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
26820 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
26830 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
26840 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
26850 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
26860 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
26870 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
26880 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
26890 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
268a0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
268b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
268c0 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
268d0 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
268e0 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
268f0 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
26900 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
26910 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
26920 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
26930 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
26940 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
26950 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
26960 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
26970 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
26980 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
26990 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
269a0 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
269b0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65     );.      }.#e
269c0 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
269d0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
269e0 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26  e(pBt, &pOvfl, &
269f0 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76  pgnoOvfl, pgnoOv
26a00 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  fl, 0);.#ifndef 
26a10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26a20 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
26a30 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
26a40 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
26a50 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
26a60 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
26a70 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
26a80 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
26a90 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
26aa0 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
26ab0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
26ac0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
26ad0 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20  page now. .     
26ae0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
26af0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
26b00 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  t overflow page,
26b10 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61   then write a pa
26b20 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  rtial entry .   
26b30 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69     ** to the poi
26b40 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20  nter-map. If we 
26b50 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f  write nothing to
26b60 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61   this pointer-ma
26b70 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a  p slot,.      **
26b80 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69   then the optimi
26b90 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68  stic overflow ch
26ba0 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ain processing i
26bb0 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20  n clearCell().  
26bc0 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e      ** may misin
26bd0 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e  terpret the unin
26be0 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73  itialised values
26bf0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a   and delete the.
26c00 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70        ** wrong p
26c10 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61  ages from the da
26c20 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
26c30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
26c40 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63  autoVacuum && rc
26c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26c60 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20         u8 eType 
26c70 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54  = (pgnoPtrmap?PT
26c80 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50  RMAP_OVERFLOW2:P
26c90 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29  TRMAP_OVERFLOW1)
26ca0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
26cb0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
26cc0 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
26cd0 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20  gnoPtrmap);.    
26ce0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
26cf0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
26d00 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
26d10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
26d20 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
26d30 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
26d40 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
26d50 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
26d60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
26d70 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54  ..      /* If pT
26d80 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
26d90 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72  zero than pPrior
26da0 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
26db0 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20   data area.     
26dc0 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
26dd0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
26de0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
26df0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
26e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
26e10 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
26e20 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
26e30 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
26e40 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
26e50 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69        /* If pPri
26e60 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  or is part of th
26e70 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
26e80 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
26e90 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20  sure pPage.     
26ea0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
26eb0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  teable */.      
26ec0 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70  assert( pPrior<p
26ed0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
26ee0 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61  Prior>=&pPage->a
26ef0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
26f00 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
26f10 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
26f20 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
26f30 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
26f40 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
26f50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
26f60 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
26f70 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
26f80 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
26f90 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
26fa0 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
26fb0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
26fc0 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
26fd0 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
26fe0 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
26ff0 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
27000 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
27010 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
27020 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
27030 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
27040 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
27050 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a  aceLeft;..    /*
27060 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
27070 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
27080 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20  pPayload points 
27090 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
270a0 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  ea.    ** of pTo
270b0 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
270c0 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
270d0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
270e0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
270f0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
27100 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
27110 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
27120 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
27130 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50  );..    /* If pP
27140 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f  ayload is part o
27150 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
27160 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
27170 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
27180 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
27190 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
271a0 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64  assert( pPayload
271b0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
271c0 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67   pPayload>=&pPag
271d0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
271e0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
271f0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
27200 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
27210 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
27220 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  ;..    if( nSrc>
27230 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
27240 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63  >nSrc ) n = nSrc
27250 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27260 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65  pSrc );.      me
27270 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
27280 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
27290 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
272a0 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
272b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
272c0 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  load -= n;.    p
272d0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20  Payload += n;.  
272e0 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20    pSrc += n;.   
272f0 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20   nSrc -= n;.    
27300 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a  spaceLeft -= n;.
27310 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20      if( nSrc==0 
27320 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20  ){.      nSrc = 
27330 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72  nData;.      pSr
27340 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  c = pData;.    }
27350 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
27360 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
27370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27380 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
27390 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
273a0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
273b0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
273c0 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
273d0 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
273e0 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
273f0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
27400 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
27410 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
27420 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
27430 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
27440 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
27450 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
27460 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
27470 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
27480 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
27490 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
274a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
274b0 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
274c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
274d0 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
274e0 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
274f0 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20   int sz){.  int 
27500 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  i;          /* L
27510 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
27520 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
27530 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
27540 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
27550 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
27560 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
27570 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
27580 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
27590 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
275a0 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
275b0 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
275c0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
275d0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
275e0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
275f0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
27600 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
27610 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
27620 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
27630 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
27640 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27650 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
27660 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
27670 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
27680 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
27690 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
276a0 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
276b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
276c0 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61   ptr = &data[pPa
276d0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
276e0 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20   2*idx];.  pc = 
276f0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
27700 20 69 66 28 20 28 70 63 3c 70 50 61 67 65 2d 3e   if( (pc<pPage->
27710 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61  hdrOffset+6+(pPa
27720 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 29 0a 20  ge->leaf?0:4)). 
27730 20 20 20 20 7c 7c 20 28 70 63 2b 73 7a 3e 70 50      || (pc+sz>pP
27740 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
27750 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Size) ){.    ret
27760 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27770 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
27780 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50  c = freeSpace(pP
27790 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
277a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
277b0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
277c0 72 63 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rc;.  }.  for(i=
277d0 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e  idx+1; i<pPage->
277e0 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b  nCell; i++, ptr+
277f0 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20  =2){.    ptr[0] 
27800 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74  = ptr[2];.    pt
27810 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20  r[1] = ptr[3];. 
27820 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
27830 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l--;.  put2byte(
27840 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
27850 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
27860 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  ->nCell);.  pPag
27870 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
27880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27890 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
278a0 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
278b0 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
278c0 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
278d0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
278e0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
278f0 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
27900 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
27910 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
27920 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
27930 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
27940 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
27950 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
27960 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
27970 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
27980 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
27990 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
279a0 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
279b0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
279c0 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
279d0 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  e->aOvfl[] and m
279e0 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
279f0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
27a00 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
27a10 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
27a20 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
27a30 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
27a40 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
27a50 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
27a60 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
27a70 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
27a80 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
27a90 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
27aa0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
27ab0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
27ac0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
27ad0 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
27ae0 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
27af0 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
27b00 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
27b10 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
27b20 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
27b30 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
27b40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
27b50 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
27b60 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
27b70 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
27b80 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
27b90 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
27ba0 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
27bb0 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74  tatic int insert
27bc0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
27bd0 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
27be0 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
27bf0 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
27c00 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
27c10 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
27c20 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
27c30 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
27c40 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
27c50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
27c60 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
27c70 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
27c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
27c90 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
27ca0 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
27cb0 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
27cc0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
27cd0 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
27ce0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38  f needed */.  u8
27cf0 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   nSkip          
27d00 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20  /* Do not write 
27d10 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
27d20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
27d30 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  l */.){.  int id
27d40 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  x;          /* W
27d50 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
27d60 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
27d70 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
27d80 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
27d90 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
27da0 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
27db0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
27dc0 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  byte of content 
27dd0 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20  for any cell in 
27de0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
27df0 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
27e00 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
27e10 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
27e20 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
27e30 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
27e40 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
27e50 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
27e60 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
27e70 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
27e80 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
27e90 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
27ea0 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68  nto data[] of th
27eb0 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
27ec0 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
27ed0 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
27ee0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
27ef0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
27f00 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
27f10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
27f20 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
27f30 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
27f40 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  *ptr;          /
27f50 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e  * Used for movin
27f60 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  g information ar
27f70 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a  ound in data[] *
27f80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  /..  assert( i>=
27f90 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
27fa0 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
27fb0 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
27fc0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
27fd0 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
27fe0 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28  pBt) && MX_CELL(
27ff0 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36  pPage->pBt)<=546
28000 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
28010 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
28020 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
28030 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  ->aOvfl) );.  as
28040 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
28050 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
28060 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
28070 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
28080 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
28090 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
280a0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
280b0 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
280c0 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
280d0 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
280e0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
280f0 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
28100 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
28110 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
28120 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
28130 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
28140 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
28150 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
28160 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
28170 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
28180 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
28190 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
281a0 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
281b0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
281c0 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  dx = (u16)i;.   
281d0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
281e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
281f0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
28200 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
28210 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
28220 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28230 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
28240 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
28250 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
28260 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
28270 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
28280 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
28290 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
282a0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
282b0 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
282c0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
282d0 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
282e0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
282f0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
28300 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
28310 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
28320 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
28330 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
28340 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
28350 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
28360 20 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67       rc = defrag
28370 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
28380 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
28390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
283a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
283b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 6f 70       }.      top
283c0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
283d0 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
283e0 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
283f0 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
28400 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
28410 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
28420 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
28430 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
28440 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
28450 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
28460 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69 66 20 28  +5]) );.    if (
28470 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e  idx+sz > pPage->
28480 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
28490 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
284a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
284b0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
284c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
284d0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
284e0 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
284f0 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
28500 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
28510 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66  sz-nSkip);.    f
28520 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
28530 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
28540 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
28550 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
28560 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
28570 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
28580 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
28590 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
285a0 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
285b0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
285c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
285d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
285e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
285f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
28600 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
28610 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
28620 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
28630 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
28640 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
28650 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
28660 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
28670 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
28680 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
28690 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
286a0 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  /.      CellInfo
286b0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c   info;.      sql
286c0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
286d0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
286e0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
286f0 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
28700 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
28710 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
28720 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
28730 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  d );.      if( i
28740 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
28750 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67  .        Pgno pg
28760 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
28770 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
28780 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
28790 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
287a0 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  t(pPage->pBt, pg
287b0 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
287c0 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
287d0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
287e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
287f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
28800 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
28810 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
28820 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28830 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
28840 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
28850 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
28860 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
28870 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
28880 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
28890 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
288a0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
288b0 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
288c0 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
288d0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
288e0 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
288f0 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
28900 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
28910 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
28920 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
28930 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
28940 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
28950 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
28960 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
28970 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20   u16 *aSize     
28980 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
28990 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
289a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
289b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
289c0 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  er */.  u8 *pCel
289d0 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64  lptr;     /* Add
289e0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
289f0 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
28a00 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20  nt cellbody;    
28a10 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
28a20 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f  ext cell body */
28a30 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
28a40 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
28a50 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
28a60 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
28a70 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20  a for pPage */. 
28a80 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
28a90 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
28aa0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
28ab0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
28ac0 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63   on pPage */.  c
28ad0 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65  onst int nUsable
28ae0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
28af0 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
28b00 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67  able size of pag
28b10 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
28b20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
28b30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
28b40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
28b50 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
28b60 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
28b70 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20  rt( nCell>=0 && 
28b80 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
28b90 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
28ba0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
28bb0 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73  )<=5460 );.  ass
28bc0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
28bd0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
28be0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
28bf0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
28c00 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75   the page has ju
28c10 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  st been zeroed b
28c20 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a  y zeroPage() */.
28c30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
28c40 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
28c50 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
28c60 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e  &data[hdr+5])==n
28c70 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65  Usable );..  pCe
28c80 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50  llptr = &data[pP
28c90 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
28ca0 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65  + nCell*2];.  ce
28cb0 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65  llbody = nUsable
28cc0 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d  ;.  for(i=nCell-
28cd0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
28ce0 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32     pCellptr -= 2
28cf0 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d  ;.    cellbody -
28d00 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
28d10 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
28d20 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  r, cellbody);.  
28d30 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
28d40 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c  ellbody], apCell
28d50 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a  [i], aSize[i]);.
28d60 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
28d70 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
28d80 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
28d90 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
28da0 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
28db0 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
28dc0 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
28dd0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
28de0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
28df0 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
28e00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
28e10 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
28e20 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
28e30 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
28e40 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
28e50 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
28e60 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
28e70 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
28e80 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
28e90 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
28ea0 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
28eb0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
28ec0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
28ed0 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
28ee0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
28ef0 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
28f00 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
28f10 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
28f20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
28f30 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
28f40 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
28f50 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
28f60 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
28f70 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
28f80 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
28f90 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
28fa0 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
28fb0 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
28fc0 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
28fd0 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
28fe0 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
28ff0 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
29000 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
29010 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
29020 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
29030 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
29040 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
29050 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
29060 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
29070 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29080 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
29090 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
290a0 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
290b0 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
290c0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
290d0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
290e0 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
290f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29100 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
29110 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
29120 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
29130 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
29140 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
29150 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
29160 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
29170 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
29180 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
29190 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
291a0 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
291b0 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
291c0 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
291d0 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
291e0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
291f0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
29200 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63  of trying balanc
29210 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
29220 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
29230 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
29240 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
29250 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
29260 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
29270 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
29280 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
29290 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
292a0 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
292b0 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
292c0 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
292d0 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
292e0 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
292f0 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
29300 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
29310 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
29320 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
29330 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
29340 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
29350 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
29360 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
29370 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
29380 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
29390 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
293a0 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
293b0 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
293c0 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
293d0 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
293e0 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
293f0 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
29400 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
29410 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
29420 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73  pSpace buffer is
29430 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
29440 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20   temporary copy 
29450 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a  of the divider.*
29460 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c  * cell that will
29470 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
29480 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20  o pParent. Such 
29490 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
294a0 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70  of a 4.** byte p
294b0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f  age number follo
294c0 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c  wed by a variabl
294d0 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
294e0 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f  . In other.** wo
294f0 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20  rds, at most 13 
29500 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65  bytes. Hence the
29510 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d   pSpace buffer m
29520 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61  ust be at.** lea
29530 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73  st 13 bytes in s
29540 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
29550 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
29560 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
29570 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  t, MemPage *pPag
29580 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a  e, u8 *pSpace){.
29590 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73    BtShared *cons
295a0 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70  t pBt = pPage->p
295b0 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65  Bt;    /* B-Tree
295c0 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d   Database */.  M
295d0 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30  emPage *pNew = 0
295e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
295f0 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
29600 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
29610 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
29620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29630 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29640 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  Code */.  Pgno p
29650 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20  gnoNew;         
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29670 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
29680 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65   pNew */..  asse
29690 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
296a0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
296b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
296c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
296d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
296e0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
296f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
29700 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75  >nCell<=0 ) retu
29710 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29720 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
29730 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
29740 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
29750 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
29760 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
29770 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
29780 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
29790 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
297a0 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
297b0 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
297c0 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
297d0 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
297e0 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
297f0 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
29800 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
29810 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
29820 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
29830 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
29840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29850 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d  ..    u8 *pOut =
29860 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20   &pSpace[4];.   
29870 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61   u8 *pCell = pPa
29880 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
29890 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  ll;.    u16 szCe
298a0 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
298b0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
298c0 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
298d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
298e0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
298f0 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
29900 65 29 20 29 3b 0a 0a 20 20 20 20 7a 65 72 6f 50  e) );..    zeroP
29910 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d  age(pNew, pPage-
29920 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
29930 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
29940 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
29950 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  zCell);.    pPag
29960 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
29970 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  ;.  .    /* Crea
29980 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
29990 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
299a0 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
299b0 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
299c0 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
299d0 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
299e0 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
299f0 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
29a00 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
29a10 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
29a20 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
29a30 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
29a40 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
29a50 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
29a60 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
29a70 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
29a80 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
29a90 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
29aa0 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
29ab0 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
29ac0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
29ad0 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
29ae0 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
29af0 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
29b00 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
29b10 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
29b20 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
29b30 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
29b40 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
29b50 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
29b60 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
29b70 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
29b80 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
29b90 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
29ba0 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
29bb0 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
29bc0 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
29bd0 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
29be0 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
29bf0 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
29c00 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
29c10 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
29c20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
29c30 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
29c40 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
29c50 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
29c60 28 70 53 70 61 63 65 2c 20 70 50 61 67 65 2d 3e  (pSpace, pPage->
29c70 70 67 6e 6f 29 3b 0a 20 20 20 20 70 43 65 6c 6c  pgno);.    pCell
29c80 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
29c90 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
29ca0 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20  1);.    pStop = 
29cb0 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
29cc0 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b  hile( (*(pCell++
29cd0 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
29ce0 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53  <pStop );.    pS
29cf0 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b  top = &pCell[9];
29d00 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28  .    while( ((*(
29d10 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c  pOut++) = *(pCel
29d20 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70  l++))&0x80) && p
29d30 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20  Cell<pStop );.. 
29d40 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
29d50 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
29d60 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 2a  l into pParent *
29d70 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c  /.    insertCell
29d80 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e  (pParent, pParen
29d90 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65  t->nCell, pSpace
29da0 2c 20 70 4f 75 74 2d 70 53 70 61 63 65 2c 20 30  , pOut-pSpace, 0
29db0 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  , 0);..    /* Se
29dc0 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
29dd0 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61  d pointer of pPa
29de0 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rent to point to
29df0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
29e00 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
29e10 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
29e20 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
29e30 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
29e40 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
29e50 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
29e60 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
29e70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
29e80 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
29e90 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
29ea0 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
29eb0 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
29ec0 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
29ed0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
29ee0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
29ef0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29f00 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
29f10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
29f20 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e  apPut(pBt, pgnoN
29f30 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ew, PTRMAP_BTREE
29f40 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
29f50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
29f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29f70 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
29f80 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29  PutOvfl(pNew, 0)
29f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29fa0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
29fb0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
29fc0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
29fd0 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  /.    releasePag
29fe0 65 28 70 4e 65 77 29 3b 0a 0a 20 20 20 20 2f 2a  e(pNew);..    /*
29ff0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
2a000 68 65 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  he pPage->nFree 
2a010 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
2a020 73 65 74 20 63 6f 72 72 65 63 74 6c 79 20 77 69  set correctly wi
2a030 74 68 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63  th.    ** respec
2a040 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  t to the content
2a050 20 6f 66 20 74 68 65 20 70 61 67 65 20 28 62 65   of the page (be
2a060 63 61 75 73 65 20 69 74 20 77 61 73 20 73 65 74  cause it was set
2a070 20 74 6f 20 30 20 62 79 20 0a 20 20 20 20 2a 2a   to 0 by .    **
2a080 20 69 6e 73 65 72 74 43 65 6c 6c 29 2e 20 53 6f   insertCell). So
2a090 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72   call sqlite3Btr
2a0a0 65 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f 20  eeInitPage() to 
2a0b0 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 0a  make sure it is.
2a0c0 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 0a      ** correct..
2a0d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2a0e0 69 73 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e  is has to be don
2a0f0 65 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  e even if an err
2a100 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  or will be retur
2a110 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  ned. Normally, i
2a120 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
2a130 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
2a140 74 72 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20  tree balancing, 
2a150 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a160 4d 65 6d 50 61 67 65 20 61 72 65 0a 20 20 20 20  MemPage are.    
2a170 2a 2a 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  ** not important
2a180 2c 20 61 73 20 74 68 65 79 20 77 69 6c 6c 20 62  , as they will b
2a190 65 20 72 65 63 61 6c 63 75 6c 61 74 65 64 20 77  e recalculated w
2a1a0 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
2a1b0 72 6f 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 62 61  rolled.    ** ba
2a1c0 63 6b 2e 20 42 75 74 20 68 65 72 65 2c 20 69 6e  ck. But here, in
2a1d0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
2a1e0 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2a1f0 20 74 68 61 74 20 70 50 61 67 65 20 68 61 73 20   that pPage has 
2a200 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20  .    ** not yet 
2a210 62 65 65 6e 20 6d 61 72 6b 65 64 20 64 69 72 74  been marked dirt
2a220 79 20 6f 72 20 77 72 69 74 74 65 6e 20 69 6e 74  y or written int
2a230 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2a240 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 0a 20 20  le. Therefore.  
2a250 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74    ** it will not
2a260 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
2a270 61 6e 64 20 73 6f 20 69 74 20 69 73 20 69 6d 70  and so it is imp
2a280 6f 72 74 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73  ortant to make s
2a290 75 72 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ure that.    ** 
2a2a0 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61 6e  the page data an
2a2b0 64 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65  d contents of Me
2a2c0 6d 50 61 67 65 20 61 72 65 20 63 6f 6e 73 69 73  mPage are consis
2a2d0 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tent..    */.   
2a2e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2a2f0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   0;.    sqlite3B
2a300 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
2a310 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge);.    assert(
2a320 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2a330 77 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72  w==0 );.  }..  r
2a340 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2a350 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2a360 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
2a370 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
2a380 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
2a390 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  tes Cells on pPa
2a3a0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a  ge and up to NN*
2a3b0 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66  2 siblings.** of
2a3c0 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61   pPage so that a
2a3d0 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
2a3e0 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f  out the same amo
2a3f0 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
2a400 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e  e..** Usually NN
2a410 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
2a420 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
2a430 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65  e is used in the
2a440 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74   balancing,.** t
2a450 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69  hough more sibli
2a460 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
2a470 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20  rom one side if 
2a480 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72  pPage is the fir
2a490 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68  st.** or last ch
2a4a0 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
2a4b0 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73  t.  If pPage has
2a4c0 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e   fewer than 2*NN
2a4d0 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f   siblings.** (so
2a4e0 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
2a4f0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
2a500 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f   pPage is the ro
2a510 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a  ot page or a .**
2a520 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20   child of root) 
2a530 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
2a540 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74  le siblings part
2a550 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2a560 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
2a570 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
2a580 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20  blings of pPage 
2a590 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
2a5a0 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
2a5b0 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f  by one or.** two
2a5c0 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
2a5d0 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
2a5e0 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
2a5f0 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72  over full. The r
2a600 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73  oot page.** is s
2a610 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c  pecial and is al
2a620 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72  lowed to be near
2a630 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61  ly empty. If pPa
2a640 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f  ge is .** the ro
2a650 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
2a660 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
2a670 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  ree might be inc
2a680 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63  reased.** or dec
2a690 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61  reased by one, a
2a6a0 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20  s necessary, to 
2a6b0 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61  keep the root pa
2a6c0 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ge from being.**
2a6d0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d   overfull or com
2a6e0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a  pletely empty..*
2a6f0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
2a700 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2a710 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
2a720 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e   of the Cells on
2a730 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
2a740 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
2a750 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d  stored in pPage-
2a760 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20  >aData[].  This 
2a770 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
2a780 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
2a790 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20  rfull.  Part of 
2a7a0 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  the job of this 
2a7b0 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a  routine is to.**
2a7c0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43   make sure all C
2a7d0 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f  ells for pPage o
2a7e0 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e  nce again fit in
2a7f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
2a800 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
2a810 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
2a820 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f  g the siblings o
2a830 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72  f pPage, the par
2a840 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20  ent of pPage.** 
2a850 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65  might become ove
2a860 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
2a870 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70  ll.  If that hap
2a880 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20  pens, then this 
2a890 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
2a8a0 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
2a8b0 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a   on the parent..
2a8c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
2a8d0 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
2a8e0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
2a8f0 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
2a900 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
2a910 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
2a920 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
2a930 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20  tine fails, the 
2a940 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a  database should.
2a950 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ** be rolled bac
2a960 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
2a970 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
2a980 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
2a990 74 2c 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64  t, int iParentId
2a9a0 78 2c 20 75 38 20 2a 61 53 70 61 63 65 32 29 7b  x, u8 *aSpace2){
2a9b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a9c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a9d0 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
2a9e0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
2a9f0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
2aa00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2aa10 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
2aa20 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
2aa30 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
2aa40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
2aa50 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
2aa60 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
2aa70 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rom. */.  int nO
2aa80 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
2aa90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2aaa0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
2aab0 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ld[] */.  int nN
2aac0 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
2aad0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2aae0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
2aaf0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ew[] */.  int i,
2ab00 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
2ab10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2ab20 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2ab30 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
2ab40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2ab50 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
2ab60 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
2ab70 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab90 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
2aba0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2abb0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2abc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
2abd0 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
2abe0 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
2abf0 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac10 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
2ac20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
2ac30 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
2ac40 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
2ac50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2ac60 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
2ac70 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
2ac80 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
2ac90 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
2aca0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2acb0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2acc0 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
2acd0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2ace0 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
2acf0 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
2ad00 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
2ad10 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
2ad20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2ad30 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2ad40 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
2ad50 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
2ad60 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
2ad70 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
2ad80 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
2ad90 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  e2[] */.  int sz
2ada0 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20  Scratch;        
2adb0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2adc0 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79  f scratch memory
2add0 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
2ade0 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e  MemPage *apOld[N
2adf0 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  B];          /* 
2ae00 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
2ae10 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  two siblings */.
2ae20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e    Pgno pgnoOld[N
2ae30 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  B];            /
2ae40 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
2ae50 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
2ae60 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  apOld[] */.  Mem
2ae70 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d  Page *apCopy[NB]
2ae80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69  ;         /* Pri
2ae90 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61  vate copies of a
2aea0 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a  pOld[] pages */.
2aeb0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77    MemPage *apNew
2aec0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f  [NB+2];        /
2aed0 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
2aee0 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66  o NB siblings af
2aef0 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f  ter balancing */
2af00 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b  .  Pgno pgnoNew[
2af10 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2af20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20  /* Page numbers 
2af30 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2af40 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38   apNew[] */.  u8
2af50 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20   *apDiv[NB];    
2af60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2af70 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
2af80 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
2af90 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
2afa0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2afb0 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
2afc0 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
2afd0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
2afe0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2aff0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
2b000 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
2b010 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
2b020 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2b030 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
2b040 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
2b050 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
2b060 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
2b070 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2b080 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
2b090 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
2b0a0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
2b0b0 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20  u8 *aCopy[NB];  
2b0c0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
2b0d0 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  for holding data
2b0e0 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a   of apCopy[] */.
2b0f0 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20    u8 *aSpace1;  
2b100 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
2b110 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
2b120 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 62  dividers cells b
2b130 65 66 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f  efore balance */
2b140 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30  .  u8 *aFrom = 0
2b150 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65  ;..  pBt = pPare
2b160 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  nt->pBt;.  asser
2b170 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2b180 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2b190 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2b1a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2b1b0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
2b1c0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 54  pDbPage) );..  T
2b1d0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2b1e0 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
2b1f0 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
2b200 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
2b210 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f  nt->pgno));..  /
2b220 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69  * Find the sibli
2b230 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61  ng pages to bala
2b240 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65  nce. Also locate
2b250 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
2b260 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74  arent .  ** that
2b270 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c   divide the sibl
2b280 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74  ings. An attempt
2b290 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
2b2a0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
2b2b0 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64  .  ** either sid
2b2c0 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65  e of pPage. More
2b2d0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
2b2e0 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
2b2f0 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a  e, however, .  *
2b300 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66  * if there are f
2b310 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
2b320 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
2b330 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72  er side. If pPar
2b340 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
2b350 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
2b360 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
2b370 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
2b380 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20  re taken..  */. 
2b390 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74   nxDiv = iParent
2b3a0 49 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20  Idx - NN;.  if( 
2b3b0 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61  nxDiv + NB > pPa
2b3c0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
2b3d0 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65     nxDiv = pPare
2b3e0 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b  nt->nCell - NB +
2b3f0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78   1;.  }.  if( nx
2b400 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44  Div<0 ){.    nxD
2b410 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  iv = 0;.  }.  fo
2b420 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20  r(i=0, k=nxDiv; 
2b430 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b  i<NB; i++, k++){
2b440 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65  .    if( k<pPare
2b450 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
2b460 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69     apDiv[i] = fi
2b470 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
2b480 6b 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  k);.      assert
2b490 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66  ( !pParent->leaf
2b4a0 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   );.      pgnoOl
2b4b0 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
2b4c0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  apDiv[i]);.    }
2b4d0 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72  else if( k==pPar
2b4e0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
2b4f0 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
2b500 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
2b510 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2b520 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
2b530 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b540 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2b550 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
2b560 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
2b570 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b  oOld[i], &apOld[
2b580 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  i]);.    if( rc 
2b590 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
2b5a0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 43 6f  leanup;.    apCo
2b5b0 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61  py[i] = 0;.    a
2b5c0 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29  ssert( i==nOld )
2b5d0 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20  ;.    nOld++;.  
2b5e0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
2b5f0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
2b600 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
2b610 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  flow;.  }..  /* 
2b620 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
2b630 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
2b640 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
2b650 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
2b660 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
2b670 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
2b680 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
2b690 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
2b6a0 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
2b6b0 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
2b6c0 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20   */.  szScratch 
2b6d0 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
2b6e0 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b700 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
2b710 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
2b720 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b740 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
2b750 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38  /.     + (ROUND8
2b760 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
2b770 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )+pBt->pageSize)
2b780 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f  *NB  /* aCopy */
2b790 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
2b7a0 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
2b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7c0 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
2b7d0 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f  /.     + (ISAUTO
2b7e0 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c  VACUUM ? nMaxCel
2b7f0 6c 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20  ls : 0);        
2b800 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f       /* aFrom */
2b810 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
2b820 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
2b830 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
2b840 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
2b850 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2b860 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
2b870 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2b880 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
2b890 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
2b8a0 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
2b8b0 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26  Copy[0] = (u8*)&
2b8c0 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
2b8d0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ];.  assert( EIG
2b8e0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2b8f0 54 28 61 43 6f 70 79 5b 30 5d 29 20 29 3b 0a 20  T(aCopy[0]) );. 
2b900 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20   for(i=1; i<NB; 
2b910 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b  i++){.    aCopy[
2b920 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d  i] = &aCopy[i-1]
2b930 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
2b940 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
2b950 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73  Page))];.    ass
2b960 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20  ert( ((aCopy[i] 
2b970 2d 20 28 75 38 2a 29 30 29 20 26 20 37 29 3d 3d  - (u8*)0) & 7)==
2b980 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
2b990 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
2b9a0 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63  d */.  }.  aSpac
2b9b0 65 31 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31  e1 = &aCopy[NB-1
2b9c0 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
2b9d0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
2b9e0 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65  mPage))];.  asse
2b9f0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2ba00 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31  LIGNMENT(aSpace1
2ba10 29 20 29 3b 0a 20 20 69 66 28 20 49 53 41 55 54  ) );.  if( ISAUT
2ba20 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 61  OVACUUM ){.    a
2ba30 46 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 31 5b  From = &aSpace1[
2ba40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
2ba50 20 20 7d 0a 20 20 2f 2a 20 61 53 70 61 63 65 32    }.  /* aSpace2
2ba60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
2ba70 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67 65 53 69  lloc(pBt->pageSi
2ba80 7a 65 29 3b 20 2a 2f 0a 20 20 69 66 28 20 61 53  ze); */.  if( aS
2ba90 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20  pace2==0 ){.    
2baa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2bab0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
2bac0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
2bad0 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61  .  .  /*.  ** Ma
2bae0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
2baf0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67   content of pPag
2bb00 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
2bb10 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a  gs into aOld[]..
2bb20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
2bb30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2bb40 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
2bb50 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
2bb60 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  her.  ** that th
2bb70 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
2bb80 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
2bb90 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
2bba0 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72  e in the.  ** pr
2bbb0 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
2bbc0 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  verwritten..  */
2bbd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
2bbe0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
2bbf0 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70  mPage *p = apCop
2bc00 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
2bc10 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d  )aCopy[i];.    m
2bc20 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69  emcpy(p, apOld[i
2bc30 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ], sizeof(MemPag
2bc40 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  e));.    p->aDat
2bc50 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d  a = (void*)&p[1]
2bc60 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
2bc70 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
2bc80 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
2bc90 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
2bca0 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
2bcb0 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
2bcc0 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
2bcd0 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
2bce0 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
2bcf0 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
2bd00 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
2bd10 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
2bd20 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
2bd30 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
2bd40 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70  btained form aSp
2bd50 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
2bd60 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
2bd70 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
2bd80 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
2bd90 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
2bda0 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
2bdb0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
2bdc0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
2bdd0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
2bde0 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
2bdf0 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
2be00 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
2be10 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
2be20 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d  * into aSpace1[]
2be30 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
2be40 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
2be50 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
2be60 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
2be70 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
2be80 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
2be90 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
2bea0 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
2beb0 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
2bec0 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
2bed0 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
2bee0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
2bef0 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
2bf00 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
2bf10 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
2bf20 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
2bf30 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
2bf40 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
2bf50 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
2bf60 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
2bf70 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
2bf80 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
2bf90 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43   keys..  */.  nC
2bfa0 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43  ell = 0;.  leafC
2bfb0 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c  orrection = apOl
2bfc0 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  d[0]->leaf*4;.  
2bfd0 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64  leafData = apOld
2bfe0 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20  [0]->hasData;.  
2bff0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
2c000 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
2c010 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
2c020 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69  y[i];.    int li
2c030 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  mit = pOld->nCel
2c040 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  l+pOld->nOverflo
2c050 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  w;.    for(j=0; 
2c060 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20  j<limit; j++){. 
2c070 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2c080 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
2c090 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
2c0a0 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
2c0b0 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
2c0c0 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
2c0d0 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
2c0e0 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
2c0f0 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 69  nCell]);.      i
2c100 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2c110 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
2c120 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b  ;.        aFrom[
2c130 6e 43 65 6c 6c 5d 20 3d 20 28 75 38 29 69 3b 20  nCell] = (u8)i; 
2c140 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
2c150 26 20 69 3c 36 20 29 3b 0a 20 20 20 20 20 20 20  & i<6 );.       
2c160 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64   for(a=0; a<pOld
2c170 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b  ->nOverflow; a++
2c180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2c190 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e   pOld->aOvfl[a].
2c1a0 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43  pCell==apCell[nC
2c1b0 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  ell] ){.        
2c1c0 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
2c1d0 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20   = 0xFF;.       
2c1e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c1f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c200 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2c210 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
2c220 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
2c230 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20  ){.      u16 sz 
2c240 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2c250 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
2c260 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
2c270 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
2c280 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46  /* With the LEAF
2c290 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65  DATA flag, pPare
2c2a0 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e  nt cells hold on
2c2b0 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a  ly INTKEYs that.
2c2c0 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64          ** are d
2c2d0 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79  uplicates of key
2c2e0 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70  s on the child p
2c2f0 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74  ages.  We need t
2c300 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20  o remove.       
2c310 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20   ** the divider 
2c320 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65  cells from pPare
2c330 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69  nt, but the divi
2c340 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e  ders cells are n
2c350 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  ot.        ** ad
2c360 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20  ded to apCell[] 
2c370 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65  because they are
2c380 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63   duplicates of c
2c390 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20  hild cells..    
2c3a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64      */.        d
2c3b0 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
2c3c0 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20   nxDiv, sz);.   
2c3d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c3e0 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
2c3f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2c400 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
2c410 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
2c420 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20  Cell] = sz;.    
2c430 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
2c440 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20  ace1[iSpace1];. 
2c450 20 20 20 20 20 20 20 69 53 70 61 63 65 31 20 2b         iSpace1 +
2c460 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73  = sz;.        as
2c470 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70  sert( sz<=pBt->p
2c480 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20  ageSize/4 );.   
2c490 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
2c4a0 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ace1<=pBt->pageS
2c4b0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ize );.        m
2c4c0 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
2c4d0 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
2c4e0 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
2c4f0 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f  ] = pTemp+leafCo
2c500 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
2c510 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2c520 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  UM ){.          
2c530 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30  aFrom[nCell] = 0
2c540 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xFF;.        }. 
2c550 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
2c560 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
2c570 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  sz);.        ass
2c580 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
2c590 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f  ion==0 || leafCo
2c5a0 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
2c5b0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
2c5c0 65 6c 6c 5d 20 2d 3d 20 28 75 31 36 29 6c 65 61  ell] -= (u16)lea
2c5d0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
2c5e0 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74       assert( get
2c5f0 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67  4byte(pTemp)==pg
2c600 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20  noOld[i] );.    
2c610 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
2c620 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2c630 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
2c640 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
2c650 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2c660 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
2c670 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
2c680 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
2c690 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a  left.          *
2c6a0 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
2c6b0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
2c6c0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
2c6d0 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
2c6e0 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f   &pOld->aData[pO
2c6f0 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
2c700 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
2c710 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2c720 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
2c730 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
2c740 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2c750 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
2c760 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2c770 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c  ot allow any cel
2c780 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ls smaller than 
2c790 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20  4 bytes. */.    
2c7a0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
2c7b0 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
2c7c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c7d0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
2c7e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c7f0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
2c800 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75  igure out the nu
2c810 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65  mber of pages ne
2c820 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  eded to hold all
2c830 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20   nCell cells..  
2c840 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75  ** Store this nu
2c850 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c  mber in "k".  Al
2c860 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77  so compute szNew
2c870 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
2c880 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20  total.  ** size 
2c890 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  of all cells on 
2c8a0 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e  the i-th page an
2c8b0 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68  d cntNew[] which
2c8c0 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20   is the index.  
2c8d0 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f  ** in apCell[] o
2c8e0 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20  f the cell that 
2c8f0 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66  divides page i f
2c900 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a  rom page i+1.  .
2c910 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73    ** cntNew[k] s
2c920 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c  hould equal nCel
2c930 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c  l..  **.  ** Val
2c940 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ues computed by 
2c950 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a  this block:.  **
2c960 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
2c970 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d  k: The total num
2c980 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70  ber of sibling p
2c990 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e  ages.  **    szN
2c9a0 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73  ew[i]: Spaced us
2c9b0 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73  ed on the i-th s
2c9c0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
2c9d0 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49  *   cntNew[i]: I
2c9e0 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ndex in apCell[]
2c9f0 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f   and szCell[] fo
2ca00 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  r the first cell
2ca10 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   to.  **        
2ca20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20        the right 
2ca30 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  of the i-th sibl
2ca40 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75  ing page..  ** u
2ca50 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62  sableSpace: Numb
2ca60 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
2ca70 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  pace available o
2ca80 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a  n each sibling..
2ca90 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61    ** .  */.  usa
2caa0 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e  bleSpace = pBt->
2cab0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20  usableSize - 12 
2cac0 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
2cad0 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c  ;.  for(subtotal
2cae0 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  =k=i=0; i<nCell;
2caf0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
2cb00 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( i<nMaxCells )
2cb10 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b  ;.    subtotal +
2cb20 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b  = szCell[i] + 2;
2cb30 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61  .    if( subtota
2cb40 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20  l > usableSpace 
2cb50 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b  ){.      szNew[k
2cb60 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73  ] = subtotal - s
2cb70 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zCell[i];.      
2cb80 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20  cntNew[k] = i;. 
2cb90 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
2cba0 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  a ){ i--; }.    
2cbb0 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a    subtotal = 0;.
2cbc0 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d        k++;.    }
2cbd0 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
2cbe0 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
2cbf0 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
2cc00 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
2cc10 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
2cc20 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
2cc30 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
2cc40 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
2cc50 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
2cc60 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
2cc70 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
2cc80 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
2cc90 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
2cca0 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
2ccb0 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
2ccc0 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
2ccd0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
2cce0 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
2ccf0 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
2cd00 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
2cd10 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
2cd20 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
2cd30 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
2cd40 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
2cd50 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
2cd60 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
2cd70 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
2cd80 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
2cd90 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
2cda0 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
2cdb0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
2cdc0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
2cdd0 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
2cde0 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
2cdf0 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
2ce00 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
2ce10 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
2ce20 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
2ce30 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
2ce40 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
2ce50 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
2ce60 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
2ce70 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
2ce80 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
2ce90 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
2cea0 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
2ceb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
2cec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2ced0 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
2cee0 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
2cef0 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
2cf00 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
2cf10 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
2cf20 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
2cf30 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
2cf40 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
2cf50 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
2cf60 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
2cf70 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
2cf80 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
2cf90 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
2cfa0 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
2cfb0 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
2cfc0 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52  zRight==0 || szR
2cfd0 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
2cfe0 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
2cff0 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20  [r]+2) ){.      
2d000 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
2d010 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
2d020 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
2d030 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
2d040 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
2d050 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
2d060 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
2d070 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
2d080 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
2d090 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
2d0a0 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
2d0b0 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
2d0c0 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
2d0d0 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
2d0e0 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
2d0f0 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20  0])>0) or pPage 
2d100 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  is.  ** a virtua
2d110 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
2d120 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
2d130 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
2d140 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
2d150 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
2d160 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
2d170 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
2d180 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
2d190 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
2d1a0 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
2d1b0 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
2d1c0 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
2d1d0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
2d1e0 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
2d1f0 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
2d200 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
2d210 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 70   */.  assert( ap
2d220 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3e 31 20 29  Old[0]->pgno>1 )
2d230 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20  ;.  pageFlags = 
2d240 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b  apOld[0]->aData[
2d250 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0];.  for(i=0; i
2d260 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  <k; i++){.    Me
2d270 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20  mPage *pNew;.   
2d280 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20   if( i<nOld ){. 
2d290 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
2d2a0 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b  w[i] = apOld[i];
2d2b0 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69  .      pgnoNew[i
2d2c0 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a  ] = pgnoOld[i];.
2d2d0 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
2d2e0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
2d2f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d300 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b  (pNew->pDbPage);
2d310 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20  .      nNew++;. 
2d320 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2d330 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2d340 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  up;.    }else{. 
2d350 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
2d360 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
2d370 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2d380 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
2d390 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65  noNew[i], pgnoNe
2d3a0 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20  w[i-1], 0);.    
2d3b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2d3c0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2d3d0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
2d3e0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e  = pNew;.      nN
2d3f0 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ew++;.    }.  }.
2d400 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
2d410 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
2d420 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
2d430 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
2d440 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
2d450 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
2d460 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
2d470 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2d480 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2d490 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
2d4a0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2d4b0 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
2d4c0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
2d4d0 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
2d4e0 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
2d4f0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
2d500 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
2d510 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
2d520 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
2d530 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
2d540 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
2d550 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
2d560 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
2d570 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
2d580 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
2d590 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
2d5a0 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
2d5b0 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
2d5c0 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
2d5d0 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
2d5e0 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
2d5f0 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
2d600 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
2d610 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
2d620 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
2d630 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
2d640 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
2d650 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
2d660 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
2d670 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
2d680 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
2d690 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
2d6a0 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
2d6b0 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
2d6c0 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
2d6d0 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
2d6e0 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
2d6f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
2d700 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2d710 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69  minV = pgnoNew[i
2d720 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  ];.    int minI 
2d730 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
2d740 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
2d750 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77       if( pgnoNew
2d760 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  [j]<(unsigned)mi
2d770 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
2d780 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
2d790 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a  minV = pgnoNew[j
2d7a0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
2d7b0 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
2d7c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a  ){.      int t;.
2d7d0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2d7e0 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e  T;.      t = pgn
2d7f0 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  oNew[i];.      p
2d800 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
2d810 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
2d820 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   pgnoNew[minI];.
2d830 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
2d840 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
2d850 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49      pgnoNew[minI
2d860 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e  ] = t;.      apN
2d870 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
2d880 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
2d890 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
2d8a0 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20   %d %d %d  new: 
2d8b0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
2d8c0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
2d8d0 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f  d)\n",.    pgnoO
2d8e0 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64  ld[0], .    nOld
2d8f0 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d  >=2 ? pgnoOld[1]
2d900 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
2d910 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a  3 ? pgnoOld[2] :
2d920 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b   0,.    pgnoNew[
2d930 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20  0], szNew[0],.  
2d940 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f    nNew>=2 ? pgno
2d950 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[1] : 0, nNew
2d960 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
2d970 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
2d980 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30  ? pgnoNew[2] : 0
2d990 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
2d9a0 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
2d9b0 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=4 ? pgnoNew[
2d9c0 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  3] : 0, nNew>=4 
2d9d0 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
2d9e0 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67      nNew>=5 ? pg
2d9f0 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e  noNew[4] : 0, nN
2da00 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d  ew>=5 ? szNew[4]
2da10 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20   : 0));..  /*.  
2da20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
2da30 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
2da40 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
2da50 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
2da60 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
2da70 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
2da80 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
2da90 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
2daa0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
2dab0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
2dac0 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
2dad0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
2dae0 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
2daf0 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
2db00 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
2db10 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2db20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2db30 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d  pgno==pgnoNew[i]
2db40 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
2db50 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
2db60 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
2db70 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
2db80 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
2db90 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
2dba0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2dbb0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
2dbc0 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
2dbd0 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
2dbe0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
2dbf0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20  rflow==0 );..   
2dc00 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2dc10 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2dc20 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
2dc30 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
2dc40 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68  ntries.    ** th
2dc50 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  at point to the 
2dc60 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
2dc70 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54  re rearranged. T
2dc80 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66  hese can be: lef
2dc90 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65  t.    ** childre
2dca0 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20  n of cells, the 
2dcb0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
2dcc0 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72  he page, or over
2dcd0 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
2dce0 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
2dcf0 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  cells..    */.  
2dd00 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2dd10 55 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  UM ){.      for(
2dd20 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d  k=j; k<cntNew[i]
2dd30 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
2dd40 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65  assert( k<nMaxCe
2dd50 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69  lls );.        i
2dd60 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46  f( aFrom[k]==0xF
2dd70 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f  F || apCopy[aFro
2dd80 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65  m[k]]->pgno!=pNe
2dd90 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  w->pgno ){.     
2dda0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2ddb0 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d  PutOvfl(pNew, k-
2ddc0 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j);.          if
2ddd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dde0 26 26 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  && leafCorrectio
2ddf0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
2de00 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2de10 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ut(pBt, get4byte
2de20 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52  (apCell[k]), PTR
2de30 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d  MAP_BTREE, pNew-
2de40 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
2de50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2de60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2de70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2de80 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2de90 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nup;.          }
2dea0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2deb0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20   }.    }..    j 
2dec0 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
2ded0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
2dee0 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
2def0 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
2df00 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2df10 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
2df20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
2df30 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
2df40 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
2df50 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65  */.    if( i<nNe
2df60 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29  w-1 && j<nCell )
2df70 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
2df80 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
2df90 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
2dfa0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
2dfb0 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
2dfc0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
2dfd0 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
2dfe0 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
2dff0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2e000 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
2e010 53 70 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b  Space2[iSpace2];
2e020 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
2e030 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2e040 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
2e050 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
2e060 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   4);.        if(
2e070 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 0a 20   ISAUTOVACUUM . 
2e080 20 20 20 20 20 20 20 20 26 26 20 28 61 46 72 6f          && (aFro
2e090 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70  m[j]==0xFF || ap
2e0a0 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e  Copy[aFrom[j]]->
2e0b0 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
2e0c0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
2e0d0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2e0e0 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
2e0f0 79 74 65 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d  yte(pCell), PTRM
2e100 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
2e110 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
2e120 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e130 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2e140 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2e150 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
2e160 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2e170 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
2e180 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
2e190 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65    /* If the tree
2e1a0 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
2e1b0 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
2e1c0 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
2e1d0 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
2e1e0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
2e1f0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
2e200 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
2e210 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
2e220 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
2e230 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
2e240 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
2e250 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
2e260 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
2e270 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
2e280 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
2e290 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
2e2a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
2e2b0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
2e2c0 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
2e2d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
2e2e0 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20  seCellPtr(pNew, 
2e2f0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f  apCell[j], &info
2e300 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  );.        pCell
2e310 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20   = pTemp;.      
2e320 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
2e330 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  l(pParent, pCell
2e340 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
2e350 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20  0, 0, 0, &sz);. 
2e360 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2e370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e380 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2e390 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2e3a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
2e3b0 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  emp = 0;.      }
2e3c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
2e3d0 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20  ell -= 4;.      
2e3e0 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73    /* Obscure cas
2e3f0 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64  e for non-leaf-d
2e400 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68  ata trees: If th
2e410 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20  e cell at pCell 
2e420 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  was.        ** p
2e430 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64  reviously stored
2e440 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c   on a leaf node,
2e450 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65   and its reporte
2e460 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20  d size was 4.   
2e470 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74       ** bytes, t
2e480 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61  hen it may actua
2e490 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  lly be smaller t
2e4a0 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20  han this .      
2e4b0 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65    ** (see sqlite
2e4c0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
2e4d0 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
2e4e0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
2e4f0 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
2e500 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
2e510 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
2e520 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
2e530 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
2e540 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
2e550 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
2e560 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
2e570 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2e580 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2e590 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
2e5a0 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
2e5b0 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
2e5c0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
2e5d0 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
2e5e0 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
2e5f0 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
2e600 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
2e610 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
2e620 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
2e630 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
2e640 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
2e650 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
2e660 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
2e670 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e680 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2e690 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
2e6a0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2e6b0 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
2e6c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e6d0 7d 0a 20 20 20 20 20 20 69 53 70 61 63 65 32 20  }.      iSpace2 
2e6e0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
2e6f0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
2e700 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
2e710 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
2e720 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  2<=pBt->pageSize
2e730 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   );.      rc = i
2e740 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
2e750 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
2e760 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a   sz, pTemp, 4);.
2e770 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e780 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
2e790 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2e7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2e7b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2e7c0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
2e7d0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2e7e0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
2e7f0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
2e800 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d  nt,nxDiv), pNew-
2e810 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 20 20 2f  >pgno);..      /
2e820 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2e830 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
2e840 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20  base, and not a 
2e850 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a  leaf-data tree,.
2e860 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70        ** then up
2e870 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2e880 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74   map with an ent
2e890 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
2e8a0 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
2e8b0 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20  * that the cell 
2e8c0 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f  just inserted po
2e8d0 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29  ints to (if any)
2e8e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2e8f0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2e900 4d 20 26 26 20 21 6c 65 61 66 44 61 74 61 20 29  M && !leafData )
2e910 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
2e920 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61  trmapPutOvfl(pPa
2e930 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20  rent, nxDiv);.  
2e940 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e960 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2e970 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2e980 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2e990 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78     j++;.      nx
2e9a0 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  Div++;.    }..  
2e9b0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69    /* Set the poi
2e9c0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
2e9d0 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  or the new sibli
2e9e0 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
2e9f0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2ea00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2ea10 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e  trmapPut(pBt, pN
2ea20 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ew->pgno, PTRMAP
2ea30 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
2ea40 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2ea50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ea60 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
2ea70 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2ea80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ea90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d   }.  assert( j==
2eaa0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
2eab0 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61  t( nOld>0 );.  a
2eac0 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
2ead0 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67  .  if( (pageFlag
2eae0 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30  s & PTF_LEAF)==0
2eaf0 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69   ){.    u8 *zChi
2eb00 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c  ld = &apCopy[nOl
2eb10 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a  d-1]->aData[8];.
2eb20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65      memcpy(&apNe
2eb30 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61  w[nNew-1]->aData
2eb40 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b  [8], zChild, 4);
2eb50 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2eb60 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
2eb70 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2eb80 74 2c 20 67 65 74 34 62 79 74 65 28 7a 43 68 69  t, get4byte(zChi
2eb90 6c 64 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  ld), PTRMAP_BTRE
2eba0 45 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  E, apNew[nNew-1]
2ebb0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
2ebc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ebd0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
2ebe0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2ebf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ec00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
2ec10 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2ec20 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
2ec30 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
2ec40 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d   nxDiv==pParent-
2ec50 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e  >nCell+pParent->
2ec60 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
2ec70 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73   /* Right-most s
2ec80 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69  ibling is the ri
2ec90 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ght-most child o
2eca0 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20  f pParent */.   
2ecb0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
2ecc0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2ecd0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
2ece0 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d   pgnoNew[nNew-1]
2ecf0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ed00 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69  /* Right-most si
2ed10 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66  bling is the lef
2ed20 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66  t child of the f
2ed30 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50  irst entry in pP
2ed40 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73  arent.    ** pas
2ed50 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
2ed60 20 64 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a   divider entry *
2ed70 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66  /.    put4byte(f
2ed80 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2ed90 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c  pParent, nxDiv),
2eda0 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d   pgnoNew[nNew-1]
2edb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
2edc0 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61  * Balance the pa
2edd0 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65  rent page.  Note
2ede0 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
2edf0 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d  t page (pPage) m
2ee00 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62  ight.  ** have b
2ee10 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  een added to the
2ee20 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20   freelist so it 
2ee30 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  might no longer 
2ee40 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
2ee50 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72    ** But the par
2ee60 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c  ent page will al
2ee70 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69  ways be initiali
2ee80 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  zed..  */.  asse
2ee90 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
2eea0 6e 69 74 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  nit );.  sqlite3
2eeb0 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
2eec0 6c 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ll);.  apCell = 
2eed0 30 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  0;.  TRACE(("BAL
2eee0 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20 77  ANCE: finished w
2eef0 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e  ith %d: old=%d n
2ef00 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
2ef10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ",.          pPa
2ef20 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20  ge->pgno, nOld, 
2ef30 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20  nNew, nCell));. 
2ef40 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61   .  /*.  ** Clea
2ef50 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
2ef60 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
2ef70 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
2ef80 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
2ef90 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  (apCell);.  for(
2efa0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
2efb0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2efc0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
2efd0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
2efe0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
2eff0 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77  eleasePage(apNew
2f000 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  [i]);.  }..  ret
2f010 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f020 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f030 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74  s used to copy t
2f040 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2f050 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73  he b-tree node s
2f060 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67  tored .** on pag
2f070 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
2f080 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72  pTo. If page pFr
2f090 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61  om was not a lea
2f0a0 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20  f page, then.** 
2f0b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
2f0c0 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
2f0d0 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20   child page are 
2f0e0 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
2f0f0 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61  the.** parent pa
2f100 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ge stored in the
2f110 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
2f120 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72  page pTo. If pFr
2f130 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  om contained.** 
2f140 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f  any cells with o
2f150 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2f160 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  nters, then the 
2f170 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
2f180 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
2f190 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70  ries are also up
2f1a0 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
2f1b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
2f1c0 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a   page pTo..**.**
2f1d0 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72   If pFrom is cur
2f1e0 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20  rently carrying 
2f1f0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
2f200 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74  ls (entries in t
2f210 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f  he.** MemPage.aO
2f220 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68  vfl[] array), th
2f230 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65  ey are not copie
2f240 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a  d to pTo. .**.**
2f250 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
2f260 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72  g, page pTo is r
2f270 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69  einitialized usi
2f280 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  ng sqlite3BtreeI
2f290 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
2f2a0 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   The performance
2f2b0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2f2c0 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61  n is not critica
2f2d0 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  l. It is only us
2f2e0 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61  ed by .** the ba
2f2f0 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
2f300 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65  ) and balance_de
2f310 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65  eper() procedure
2f320 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a  s, neither of.**
2f330 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65   which are calle
2f340 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f  d often under no
2f350 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63  rmal circumstanc
2f360 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2f370 74 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  t copyNodeConten
2f380 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
2f390 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 29 7b  , MemPage *pTo){
2f3a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f  .  BtShared * co
2f3b0 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d  nst pBt = pFrom-
2f3c0 3e 70 42 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  >pBt;.  u8 * con
2f3d0 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  st aFrom = pFrom
2f3e0 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20  ->aData;.  u8 * 
2f3f0 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
2f400 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 63 6f  >aData;.  int co
2f410 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70  nst iFromHdr = p
2f420 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b  From->hdrOffset;
2f430 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f  .  int const iTo
2f440 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e  Hdr = ((pTo->pgn
2f450 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29  o==1) ? 100 : 0)
2f460 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2f470 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 44  ITE_OK;.  int iD
2f480 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ata;..  assert( 
2f490 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b  pFrom->isInit );
2f4a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
2f4b0 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
2f4c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74  );.  assert( get
2f4d0 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2f4e0 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e  omHdr+5])<=pBt->
2f4f0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20  usableSize );.. 
2f500 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74   /* Copy the b-t
2f510 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74  ree node content
2f520 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d   from page pFrom
2f530 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f   to page pTo. */
2f540 0a 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62  .  iData = get2b
2f550 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
2f560 48 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  Hdr+5]);.  memcp
2f570 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
2f580 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
2f590 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
2f5a0 61 74 61 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ata);.  memcpy(&
2f5b0 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46  aTo[iToHdr], &aF
2f5c0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70  rom[iFromHdr], p
2f5d0 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  From->cellOffset
2f5e0 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c   + 2*pFrom->nCel
2f5f0 6c 29 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74  l);..  /* Reinit
2f600 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20  ialize page pTo 
2f610 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  so that the cont
2f620 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ents of the MemP
2f630 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  age structure.  
2f640 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
2f650 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
2f660 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
2f670 20 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20   "cannot" fail, 
2f680 61 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  as the.  ** data
2f690 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46 72   copied from pFr
2f6a0 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  om is known to b
2f6b0 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 70  e valid.  */.  p
2f6c0 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  To->isInit = 0;.
2f6d0 20 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20    TESTONLY(rc = 
2f6e0 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  ) sqlite3BtreeIn
2f6f0 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 61  itPage(pTo);.  a
2f700 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2f710 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  E_OK );..  /* If
2f720 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2f730 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2f740 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2f750 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2f760 0a 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d  .  ** for any b-
2f770 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
2f780 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
2f790 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
2f7a0 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f   pointers to. */
2f7b0 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2f7c0 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
2f7d0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2f7e0 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pTo);.  }.  retu
2f7f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2f810 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 6f  called on the ro
2f820 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74 72  ot page of a btr
2f830 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74  ee when the root
2f840 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  .** page contain
2f850 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 69 73  s no cells. This
2f860 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69   is an opportuni
2f870 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ty to make the t
2f880 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72  ree.** shallower
2f890 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a   by one level..*
2f8a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2f8b0 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d  ance_shallower(M
2f8c0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 29 7b 0a  emPage *pRoot){.
2f8d0 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70  .  /* The root p
2f8e0 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75 74  age is empty but
2f8f0 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20   has one child. 
2f900 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20   Transfer the.  
2f910 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
2f920 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69  rom that one chi
2f930 6c 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74  ld into the root
2f940 20 70 61 67 65 20 69 66 20 69 74 20 0a 20 20 2a   page if it .  *
2f950 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69  * will fit.  Thi
2f960 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64 65  s reduces the de
2f970 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
2f980 62 79 20 6f 6e 65 2e 0a 20 20 2a 2a 0a 20 20 2a  by one..  **.  *
2f990 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * If the root pa
2f9a0 67 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74  ge is page 1, it
2f9b0 20 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20   has less space 
2f9c0 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20  available than. 
2f9d0 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64   ** its child (d
2f9e0 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79  ue to the 100 by
2f9f0 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  te header that o
2fa00 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67  ccurs at the beg
2fa10 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74  inning.  ** of t
2fa20 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29  he database fle)
2fa30 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f  , so it might no
2fa40 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c  t be able to hol
2fa50 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20  d all of the .  
2fa60 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
2fa70 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
2fa80 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
2fa90 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
2faa0 20 0a 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65   .  ** case, the
2fab0 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20  n do not do the 
2fac0 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76 65  transfer.  Leave
2fad0 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65 78   page 1 empty ex
2fae0 63 65 70 74 0a 20 20 2a 2a 20 66 6f 72 20 74 68  cept.  ** for th
2faf0 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
2fb00 74 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  to the child pag
2fb10 65 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70 61  e.  The child pa
2fb20 67 65 20 62 65 63 6f 6d 65 73 0a 20 20 2a 2a 20  ge becomes.  ** 
2fb30 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
2fb40 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20   of the tree..  
2fb50 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2fb60 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2fb90 2f 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 68 64  /.  int const hd
2fba0 72 20 3d 20 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  r = pRoot->hdrOf
2fbb0 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  fset;          /
2fbc0 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 6f 6f 74  * Offset of root
2fbd0 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
2fbe0 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
2fbf0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fc10 4f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 70 52  Only child of pR
2fc20 6f 6f 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 63 6f  oot */.  Pgno co
2fc30 6e 73 74 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  nst pgnoChild = 
2fc40 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
2fc50 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
2fc60 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 0a  rOffset+8]);.  .
2fc70 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
2fc80 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
2fc90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2fca0 75 74 65 78 5f 68 65 6c 64 28 70 52 6f 6f 74 2d  utex_held(pRoot-
2fcb0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2fcc0 20 20 61 73 73 65 72 74 28 20 21 70 52 6f 6f 74    assert( !pRoot
2fcd0 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 61 73 73 65  ->leaf );.  asse
2fce0 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
2fcf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
2fd00 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67  oChild<=pagerPag
2fd10 65 63 6f 75 6e 74 28 70 52 6f 6f 74 2d 3e 70 42  ecount(pRoot->pB
2fd20 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
2fd30 68 64 72 3d 3d 30 20 7c 7c 20 70 52 6f 6f 74 2d  hdr==0 || pRoot-
2fd40 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 0a 20  >pgno==1 );.  . 
2fd50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2fd60 65 65 47 65 74 50 61 67 65 28 70 52 6f 6f 74 2d  eeGetPage(pRoot-
2fd70 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c  >pBt, pgnoChild,
2fd80 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20   &pChild, 0);.  
2fd90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fda0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 68  K ){.    if( pCh
2fdb0 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 68 64 72 20  ild->nFree>=hdr 
2fdc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 64 72  ){.      if( hdr
2fdd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fde0 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
2fdf0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
2fe00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2fe10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fe20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
2fe30 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 43 68  yNodeContent(pCh
2fe40 69 6c 64 2c 20 70 52 6f 6f 74 29 3b 0a 20 20 20  ild, pRoot);.   
2fe50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2fe60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fe70 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
2fe80 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2fe90 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2fea0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
2feb0 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e  hild has more in
2fec0 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
2fed0 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
2fee0 6f 6f 74 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  oot..      ** Th
2fef0 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
2ff00 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
2ff10 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
2ff20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2ff30 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c  E: child %d will
2ff40 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65   not fit on page
2ff50 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
2ff60 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
2ff70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
2ff80 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ild);.  }..  ret
2ff90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2ffa0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2ffb0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
2ffc0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2ffd0 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  a b-tree structu
2ffe0 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c  re is.** overful
2fff0 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  l (has one or mo
30000 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
30010 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  s)..**.** A new 
30020 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c  child page is al
30030 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
30040 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
30050 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20  current root.** 
30060 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  page, including 
30070 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20  overflow cells, 
30080 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  are copied into 
30090 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72  the child. The r
300a0 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74  oot.** page is t
300b0 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20  hen overwritten 
300c0 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d  to make it an em
300d0 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68  pty page with th
300e0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a  e right-child .*
300f0 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  * pointer pointi
30100 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ng to the new pa
30110 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ge..**.** Before
30120 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20   returning, all 
30130 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
30140 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
30150 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74  g to pages .** t
30160 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c  hat the new chil
30170 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61  d-page now conta
30180 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
30190 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65  are updated. The
301a0 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73  .** entry corres
301b0 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e  ponding to the n
301c0 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  ew right-child p
301d0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f  ointer of the ro
301e0 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c  ot.** page is al
301f0 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  so updated..**.*
30200 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
30210 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
30220 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65   to contain a re
30230 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
30240 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e  hild .** page an
30250 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
30260 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
30270 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72   case the caller
30280 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20   is required.** 
30290 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
302a0 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c  age() on *ppChil
302b0 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20  d exactly once. 
302c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
302d0 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  rs,.** an error 
302e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
302f0 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73   and *ppChild is
30300 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74   set to 0..*/.st
30310 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
30320 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
30330 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20  *pRoot, MemPage 
30340 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e  **ppChild){.  in
30350 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
30360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30370 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
30380 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
30390 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
303a0 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  hild = 0;       
303b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
303c0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
303d0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
303e0 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
303f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
30400 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
30410 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
30420 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
30430 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20   pRoot->pBt;    
30440 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a  /* The BTree */.
30450 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
30460 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
30470 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30480 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
30490 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
304a0 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74  /* Make pRoot, t
304b0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
304c0 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74  the b-tree, writ
304d0 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61  able. Allocate a
304e0 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20   new .  ** page 
304f0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
30500 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63   the new right-c
30510 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43  hild of pPage. C
30520 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
30530 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64  .  ** of the nod
30540 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f  e stored on pRoo
30550 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63  t into the new c
30560 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  hild page..  */.
30570 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
30580 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
30590 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
305a0 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20  pDbPage)).   || 
305b0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
305c0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
305d0 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26  ge(pBt,&pChild,&
305e0 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d  pgnoChild,pRoot-
305f0 3e 70 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c 20  >pgno,0)).   || 
30600 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
30610 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
30620 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29 29  (pRoot, pChild))
30630 0a 20 20 20 7c 7c 20 28 49 53 41 55 54 4f 56 41  .   || (ISAUTOVA
30640 43 55 55 4d 20 26 26 20 0a 20 20 20 20 20 20 20  CUUM && .       
30650 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
30660 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
30670 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41  pgnoChild, PTRMA
30680 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e  P_BTREE, pRoot->
30690 70 67 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20 20  pgno))).  ){.   
306a0 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20   *ppChild = 0;. 
306b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
306c0 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
306d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
306e0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
306f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
30700 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
30710 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30720 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
30730 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
30740 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
30750 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70  pChild->nCell==p
30760 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Root->nCell );..
30770 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
30780 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
30790 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f  into %d\n", pRoo
307a0 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  t->pgno, pChild-
307b0 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43  >pgno));..  /* C
307c0 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  opy the overflow
307d0 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f   cells from pRoo
307e0 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20  t to pChild */. 
307f0 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
30800 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f  aOvfl, pRoot->aO
30810 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  vfl, pRoot->nOve
30820 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f  rflow*sizeof(pRo
30830 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ot->aOvfl[0]));.
30840 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
30850 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76  low = pRoot->nOv
30860 65 72 66 6c 6f 77 3b 0a 20 20 70 43 68 69 6c 64  erflow;.  pChild
30870 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20  ->nFree = 0;..  
30880 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74  /* Zero the cont
30890 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54  ents of pRoot. T
308a0 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68 69  hen install pChi
308b0 6c 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d  ld as the right-
308c0 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f  child. */.  zero
308d0 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43 68 69  Page(pRoot, pChi
308e0 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e  ld->aData[0] & ~
308f0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74  PTF_LEAF);.  put
30900 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
30910 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
30920 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69  fset+8], pgnoChi
30930 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64  ld);..  *ppChild
30940 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72 65 74   = pChild;.  ret
30950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
30960 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
30970 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65   that pCur curre
30980 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68  ntly points to h
30990 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64  as just been mod
309a0 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65  ified in.** some
309b0 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74   way. This funct
309c0 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20  ion figures out 
309d0 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61  if this modifica
309e0 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a  tion means the.*
309f0 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20  * tree needs to 
30a00 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64  be balanced, and
30a10 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65   if so calls the
30a20 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
30a30 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69  ancing .** routi
30a40 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f  ne. Balancing ro
30a50 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a  utines are:.**.*
30a60 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  *   balance_quic
30a70 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  k().**   balance
30a80 5f 73 68 61 6c 6c 6f 77 65 72 28 29 0a 2a 2a 20  _shallower().** 
30a90 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72    balance_deeper
30aa0 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  ().**   balance_
30ab0 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2a 0a 2a 2a 20  nonroot().**.** 
30ac0 49 66 20 62 75 69 6c 74 20 77 69 74 68 20 53 51  If built with SQ
30ad0 4c 49 54 45 5f 44 45 42 55 47 2c 20 70 43 75 72  LITE_DEBUG, pCur
30ae0 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
30af0 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
30b00 66 20 0a 2a 2a 20 62 61 6c 61 6e 63 65 5f 73 68  f .** balance_sh
30b10 61 6c 6c 6f 77 65 72 28 29 2c 20 62 61 6c 61 6e  allower(), balan
30b20 63 65 5f 64 65 65 70 65 72 28 29 20 6f 72 20 62  ce_deeper() or b
30b30 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
30b40 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49   is called..** I
30b50 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  f none of these 
30b60 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69 6e  functions are in
30b70 76 6f 6b 65 64 2c 20 70 43 75 72 2d 3e 70 61 67  voked, pCur->pag
30b80 65 73 53 68 75 66 66 6c 65 64 20 69 73 20 6c 65  esShuffled is le
30b90 66 74 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65 64  ft.** unmodified
30ba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30bb0 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72  balance(BtCursor
30bc0 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
30bd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30be0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20   const int nMin 
30bf0 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61  = pCur->pBt->usa
30c00 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b  bleSize * 2 / 3;
30c10 0a 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51 75  .  u8 aBalanceQu
30c20 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20  ickSpace[13];.  
30c30 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  u8 *pFree = 0;..
30c40 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20    TESTONLY( int 
30c50 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61  balance_quick_ca
30c60 6c 6c 65 64 20 3d 20 30 3b 20 29 3b 0a 20 20 54  lled = 0; );.  T
30c70 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c  ESTONLY( int bal
30c80 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
30c90 65 64 20 3d 20 30 3b 20 29 3b 0a 0a 20 20 64 6f  ed = 0; );..  do
30ca0 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   {.    int iPage
30cb0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
30cc0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
30cd0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
30ce0 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69  e[iPage];..    i
30cf0 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( iPage==0 ){. 
30d00 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
30d10 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
30d20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74       /* The root
30d30 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
30d40 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  ree is overfull.
30d50 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 61   In this case ca
30d60 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ll the.        *
30d70 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  * balance_deeper
30d80 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
30d90 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c  reate a new chil
30da0 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  d for the root-p
30db0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  age.        ** a
30dc0 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75 72 72  nd copy the curr
30dd0 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
30de0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f  the root-page to
30df0 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20 20   it. The.       
30e00 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69   ** next iterati
30e10 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
30e20 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74  p will balance t
30e30 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  he child page.. 
30e40 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
30e50 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61     assert( (bala
30e60 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65  nce_deeper_calle
30e70 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  d++)==0 );.     
30e80 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
30e90 64 65 65 70 65 72 28 70 50 61 67 65 2c 20 26 70  deeper(pPage, &p
30ea0 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b  Cur->apPage[1]);
30eb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
30ec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30ed0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50          pCur->iP
30ee0 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  age = 1;.       
30ef0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30     pCur->aiIdx[0
30f00 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
30f10 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20   pCur->aiIdx[1] 
30f20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
30f30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
30f40 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  age[1]->nOverflo
30f50 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  w );.        }. 
30f60 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28         VVA_ONLY(
30f70 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66   pCur->pagesShuf
30f80 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20  fled = 1 );.    
30f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30fa0 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
30fb0 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
30fc0 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 49 66  is now empty. If
30fd0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 69   the root-page i
30fe0 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
30ff0 20 61 6c 73 6f 20 61 20 6c 65 61 66 20 70 61 67   also a leaf pag
31000 65 2c 20 69 74 20 77 69 6c 6c 20 68 61 76 65 20  e, it will have 
31010 61 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  a single child p
31020 61 67 65 2e 20 43 61 6c 6c 20 0a 20 20 20 20 20  age. Call .     
31030 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 73 68     ** balance_sh
31040 61 6c 6c 6f 77 65 72 20 74 6f 20 61 74 74 65 6d  allower to attem
31050 70 74 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63  pt to copy the c
31060 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 73  ontents of the s
31070 69 6e 67 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  ingle.        **
31080 20 63 68 69 6c 64 2d 70 61 67 65 20 69 6e 74 6f   child-page into
31090 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 28   the root page (
310a0 74 68 69 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  this may not be 
310b0 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 0a  possible if the.
310c0 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6f 74 20          ** root 
310d0 70 61 67 65 20 69 73 20 70 61 67 65 20 31 29 2e  page is page 1).
310e0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
310f0 20 20 20 20 2a 2a 20 57 68 65 74 68 65 72 20 6f      ** Whether o
31100 72 20 6e 6f 74 20 74 68 69 73 20 69 73 20 70 6f  r not this is po
31110 73 73 69 62 6c 65 20 2c 20 74 68 65 20 74 72 65  ssible , the tre
31120 65 20 69 73 20 6e 6f 77 20 62 61 6c 61 6e 63 65  e is now balance
31130 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  d. .        ** T
31140 68 65 72 65 66 6f 72 65 20 69 73 20 6e 6f 20 6e  herefore is no n
31150 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
31160 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 2e 0a 20 20   the do-loop..  
31170 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
31180 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
31190 6c 6c 3d 3d 30 20 26 26 20 21 70 50 61 67 65 2d  ll==0 && !pPage-
311a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
311b0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
311c0 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29  shallower(pPage)
311d0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 56 41 5f  ;.          VVA_
311e0 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65  ONLY( pCur->page
311f0 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b  sShuffled = 1 );
31200 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31210 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31220 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
31230 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
31240 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
31250 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20  ree<=nMin ){.   
31260 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
31270 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  lse{.      MemPa
31280 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65  ge * const pPare
31290 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  nt = pCur->apPag
312a0 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20  e[iPage-1];.    
312b0 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78    int const iIdx
312c0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69   = pCur->aiIdx[i
312d0 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20  Page-1];..      
312e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
312f0 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
31300 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
31310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31320 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  K ){.#ifndef SQL
31330 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
31340 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66  LANCE.        if
31350 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
31360 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
31370 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
31380 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
31390 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
313a0 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20  ==pPage->nCell. 
313b0 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65          && pPare
313c0 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20  nt->pgno!=1.    
313d0 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d       && pParent-
313e0 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20  >nCell==iIdx.   
313f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
31400 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63    /* Call balanc
31410 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65  e_quick() to cre
31420 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e  ate a new siblin
31430 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68  g of pPage on wh
31440 69 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ich.          **
31450 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76   to store the ov
31460 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c  erflow cell. bal
31470 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73  ance_quick() ins
31480 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a  erts a new cell.
31490 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
314a0 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68  o pParent, which
314b0 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65   may cause pPare
314c0 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20  nt overflow. If 
314d0 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
314e0 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e  * happens, the n
314f0 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f  ext interation o
31500 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
31510 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65  ll balance pPare
31520 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt .          **
31530 20 75 73 65 20 65 69 74 68 65 72 20 62 61 6c 61   use either bala
31540 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72  nce_nonroot() or
31550 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
31560 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20  ). Until this.  
31570 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
31580 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ns, the overflow
31590 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20   cell is stored 
315a0 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  in the aBalanceQ
315b0 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20  uickSpace[].    
315c0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
315d0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
315e0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
315f0 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66  purpose of the f
31600 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
31610 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68  ) is to check th
31620 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20  at only a.      
31630 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61      ** single ca
31640 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75  ll to balance_qu
31650 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f  ick() is made fo
31660 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74  r each call to t
31670 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
31680 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
31690 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69  is were not veri
316a0 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62  fied, a subtle b
316b0 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75  ug involving reu
316c0 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
316d0 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  of the aBalanceQ
316e0 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68  uickSpace[] migh
316f0 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20  t sneak in..    
31700 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31710 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61     assert( (bala
31720 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
31730 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
31740 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
31750 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20  _quick(pParent, 
31760 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51  pPage, aBalanceQ
31770 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20  uickSpace);.    
31780 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
31790 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
317a0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
317b0 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  case, call balan
317c0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20  ce_nonroot() to 
317d0 72 65 64 69 73 74 72 69 62 75 74 65 20 63 65 6c  redistribute cel
317e0 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
317f0 62 65 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e  between pPage an
31800 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73  d up to 2 of its
31810 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20   sibling pages. 
31820 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20  This involves.  
31830 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
31840 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
31850 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68  s of pParent, wh
31860 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50  ich may cause pP
31870 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20  arent to.       
31880 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65     ** become ove
31890 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
318a0 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65  ll. The next ite
318b0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
318c0 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20  -loop.          
318d0 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  ** will balance 
318e0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
318f0 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e  to correct this.
31900 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
31910 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
31920 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
31930 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
31940 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
31950 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20  ll or cells.    
31960 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f        ** are sto
31970 72 65 64 20 69 6e 20 74 68 65 20 70 53 70 61 63  red in the pSpac
31980 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  e buffer allocat
31990 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  ed immediately b
319a0 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20  elow. .         
319b0 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74   ** A subsequent
319c0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
319d0 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64  e do-loop will d
319e0 65 61 6c 20 77 69 74 68 20 74 68 69 73 20 62 79  eal with this by
319f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
31a00 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f  lling balance_no
31a10 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65  nroot() (balance
31a20 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20 62 65  _deeper() may be
31a30 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20   called first,. 
31a40 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20           ** but 
31a50 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20  it doesn't deal 
31a60 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65  with overflow ce
31a70 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73  lls - just moves
31a80 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20   them to a.     
31a90 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e       ** differen
31aa0 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68  t page). Once th
31ab0 69 73 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  is subsequent ca
31ac0 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
31ad0 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20  nroot() .       
31ae0 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65     ** has comple
31af0 74 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  ted, it is safe 
31b00 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70  to release the p
31b10 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65  Space buffer use
31b20 64 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a  d by.          *
31b30 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  * the previous c
31b40 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72  all, as the over
31b50 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77  flow cell data w
31b60 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20  ill have been . 
31b70 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69           ** copi
31b80 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  ed either into t
31b90 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74  he body of a dat
31ba0 61 62 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e  abase page or in
31bb0 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20  to the new.     
31bc0 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62       ** pSpace b
31bd0 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
31be0 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20  the latter call 
31bf0 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
31c00 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20  ot()..          
31c10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
31c20 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  *pSpace = sqlite
31c30 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72  3PageMalloc(pCur
31c40 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
31c50 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
31c60 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
31c70 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20  (pParent, iIdx, 
31c80 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  pSpace);.       
31c90 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a     if( pFree ){.
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31cb0 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e  f pFree is not N
31cc0 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74  ULL, it points t
31cd0 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
31ce0 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20  fer used .      
31cf0 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72        ** by a pr
31d00 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62  evious call to b
31d10 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
31d20 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61  . Its contents a
31d30 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
31d40 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74  * now stored eit
31d50 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61  her on real data
31d60 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69  base pages or wi
31d70 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  thin the .      
31d80 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70        ** new pSp
31d90 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69  ace buffer, so i
31da0 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20  t may be safely 
31db0 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20  freed here. */. 
31dc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
31dd0 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
31de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  );.          }..
31df0 09 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63 65  .  /* The pSpace
31e00 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 20   buffer will be 
31e10 66 72 65 65 64 20 61 66 74 65 72 20 74 68 65 20  freed after the 
31e20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 09 20 20  next call to..  
31e30 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ** balance_nonro
31e40 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65  ot(), or just be
31e50 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
31e60 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63  on returns, whic
31e70 68 65 76 65 72 0a 09 20 20 2a 2a 20 63 6f 6d 65  hever..  ** come
31e80 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  s first. */.    
31e90 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 53        pFree = pS
31ea0 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 20 20  pace;.          
31eb0 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
31ec0 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
31ed0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  1 );.        }. 
31ee0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
31ef0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
31f00 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   0;..      /* Th
31f10 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
31f20 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
31f30 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72  balances the par
31f40 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ent page. */.   
31f50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
31f60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75  Page);.      pCu
31f70 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
31f80 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
31f90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
31fa0 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
31fb0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
31fc0 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFree);.  }.  r
31fd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31fe0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
31ff0 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f  checks all curso
32000 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  rs that point to
32010 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e   table pgnoRoot.
32020 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68  .** If any of th
32030 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65 72 65  ose cursors were
32040 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
32050 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66  lag==0 in a diff
32060 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73  erent.** databas
32070 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20  e connection (a 
32080 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
32090 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20  ion that shares 
320a0 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63  the pager.** cac
320b0 68 65 20 77 69 74 68 20 74 68 65 20 63 75 72 72  he with the curr
320c0 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20  ent connection) 
320d0 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20 63  and that other c
320e0 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  onnection .** is
320f0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64   not in the Read
32100 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61  Uncommmitted sta
32110 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  te, then this ro
32120 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a  utine returns .*
32130 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  * SQLITE_LOCKED.
32140 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61  .**.** As well a
32150 73 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77  s cursors with w
32160 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72  rFlag==0, cursor
32170 73 20 77 69 74 68 20 0a 2a 2a 20 69 73 49 6e 63  s with .** isInc
32180 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20 61  rblobHandle==1 a
32190 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72  re also consider
321a0 65 64 20 27 72 65 61 64 27 20 63 75 72 73 6f 72  ed 'read' cursor
321b0 73 20 62 65 63 61 75 73 65 0a 2a 2a 20 69 6e 63  s because.** inc
321c0 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
321d0 72 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66  rsors are used f
321e0 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20  or both reading 
321f0 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a  and writing..**.
32200 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74  ** When pgnoRoot
32210 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
32220 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74  e of an intkey t
32230 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  able, this funct
32240 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ion is also.** r
32250 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69  esponsible for i
32260 6e 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72  nvalidating incr
32270 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
32280 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61  sors when the ta
32290 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68  ble row.** on wh
322a0 69 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65  ich they are ope
322b0 6e 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f  ned is deleted o
322c0 72 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73  r modified. Curs
322d0 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
322e0 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
322f0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
32300 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
32310 20 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c   1) When BtreeCl
32320 65 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61  earTable() is ca
32330 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
32340 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f  ly delete the co
32350 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f  ntents.**      o
32360 66 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65  f a B-Tree table
32370 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65  , pExclude is se
32380 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61  t to zero and pa
32390 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20  rameter iRow is 
323a0 0a 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20  .**      set to 
323b0 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69  non-zero. In thi
323c0 73 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65  s case all incre
323d0 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
323e0 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20  ors open.**     
323f0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f   on the table ro
32400 6f 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74  oted at pgnoRoot
32410 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
32420 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
32430 6e 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c  n BtreeInsert(),
32440 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
32450 72 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29  r BtreePutData()
32460 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a   is called to .*
32470 2a 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20  *      modify a 
32480 74 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e  table row via an
32490 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
324a0 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20  pExclude is set 
324b0 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  to the .**      
324c0 77 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65  write cursor use
324d0 64 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69  d to do the modi
324e0 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72  fication and par
324f0 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73  ameter iRow is s
32500 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  et.**      to th
32510 65 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64  e integer row id
32520 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65   of the B-Tree e
32530 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66  ntry being modif
32540 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20  ied. Unless.**  
32550 20 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20      pExclude is 
32560 69 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d  itself an increm
32570 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
32580 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72  r, then all incr
32590 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20  emental.**      
325a0 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
325b0 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66  n on row iRow of
325c0 20 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20   the B-Tree are 
325d0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
325e0 2a 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20  **   3) If both 
325f0 70 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f  pExclude and iRo
32600 77 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72  w are set to zer
32610 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61  o, no incrementa
32620 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20  l blob .**      
32630 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  cursors are inva
32640 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  lidated..*/.stat
32650 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 52  ic int checkForR
32660 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 0a 20 20  eadConflicts(.  
32670 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
32680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
32690 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
326a0 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20  check */.  Pgno 
326b0 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20  pgnoRoot,       
326c0 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72     /* Look for r
326d0 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
326e0 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42  his btree */.  B
326f0 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64  tCursor *pExclud
32700 65 2c 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65  e,     /* Ignore
32710 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
32720 20 20 69 36 34 20 69 52 6f 77 20 20 20 20 20 20    i64 iRow      
32730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
32740 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68   rowid that migh
32750 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
32760 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
32770 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
32780 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
32790 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
327a0 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  = pBtree->db;.  
327b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
327c0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
327d0 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28  Btree) );.  for(
327e0 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
327f0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
32800 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c      if( p==pExcl
32810 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ude ) continue;.
32820 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
32830 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20  oot!=pgnoRoot ) 
32840 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65  continue;.#ifnde
32850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
32860 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20 70  CRBLOB.    if( p
32870 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
32880 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20 20 20  le && ( .       
32890 20 20 28 21 70 45 78 63 6c 75 64 65 20 26 26 20    (!pExclude && 
328a0 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20 28  iRow).      || (
328b0 70 45 78 63 6c 75 64 65 20 26 26 20 21 70 45 78  pExclude && !pEx
328c0 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f  clude->isIncrblo
328d0 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e  bHandle && p->in
328e0 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20  fo.nKey==iRow). 
328f0 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e     )){.      p->
32900 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
32910 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23  INVALID;.    }.#
32920 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d  endif.    if( p-
32930 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
32940 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65  VALID ) continue
32950 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46  ;.    if( p->wrF
32960 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20  lag==0 .#ifndef 
32970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
32980 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e  BLOB.     || p->
32990 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
329a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20  .#endif.    ){. 
329b0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
329c0 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65  Other = p->pBtre
329d0 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 61 73 73  e->db;.      ass
329e0 65 72 74 28 64 62 4f 74 68 65 72 29 3b 0a 20 20  ert(dbOther);.  
329f0 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 21      if( dbOther!
32a00 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d  =db && (dbOther-
32a10 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
32a20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
32a30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
32a40 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
32a50 42 6c 6f 63 6b 65 64 28 64 62 2c 20 64 62 4f 74  Blocked(db, dbOt
32a60 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  her);.        re
32a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
32a80 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
32a90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
32aa0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
32ab0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
32ac0 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
32ad0 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
32ae0 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
32af0 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
32b00 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
32b10 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
32b20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
32b30 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
32b40 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
32b50 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
32b60 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
32b70 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
32b80 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
32b90 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
32ba0 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
32bb0 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
32bc0 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
32bd0 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
32be0 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
32bf0 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
32c00 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
32c10 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
32c20 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
32c30 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
32c40 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
32c50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
32c60 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
32c70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
32c80 65 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  en a successful 
32c90 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
32ca0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20  e3BtreeMoveto() 
32cb0 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70  to seek cursor p
32cc0 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b  Cur to (pKey, nK
32cd0 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ey) has already.
32ce0 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65  ** been performe
32cf0 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69 73  d. seekResult is
32d00 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73 75   the search resu
32d10 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61 20 6e  lt returned (a n
32d20 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65  egative.** numbe
32d30 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73  r if pCur points
32d40 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
32d50 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
32d60 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20  n (pKey, nKey), 
32d70 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76 65  or.** a positive
32d80 20 76 61 6c 75 65 20 69 66 20 70 43 75 72 20 70   value if pCur p
32d90 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72 79  oints at an etry
32da0 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
32db0 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20  than .** (pKey, 
32dc0 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49  nKey)). .**.** I
32dd0 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  f the seekResult
32de0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
32df0 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43 75   then cursor pCu
32e00 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  r may point to a
32e10 6e 79 20 0a 2a 2a 20 65 6e 74 72 79 20 6f 72 20  ny .** entry or 
32e20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20 61  to no entry at a
32e30 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ll. In this case
32e40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
32e50 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68  as to seek.** th
32e60 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65 20  e cursor before 
32e70 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e 20  the new key can 
32e80 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
32e90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
32ea0 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
32eb0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
32ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
32ed0 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
32ee0 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
32ef0 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
32f00 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
32f10 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
32f20 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
32f30 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
32f40 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
32f50 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
32f60 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
32f70 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
32f80 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
32f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32fa0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
32fb0 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
32fc0 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
32fd0 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20  nt appendBias,  
32fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32ff0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
33000 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
33010 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52  d */.  int seekR
33020 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
33030 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
33040 6f 66 20 70 72 69 6f 72 20 73 71 6c 69 74 65 33  of prior sqlite3
33050 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 63 61  BtreeMoveto() ca
33060 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ll */.){.  int r
33070 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73  c;.  int loc = s
33080 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  eekResult;.  int
33090 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64   szNew;.  int id
330a0 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
330b0 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  age;.  Btree *p 
330c0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
330d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
330e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
330f0 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65  gned char *oldCe
33100 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ll;.  unsigned c
33110 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30  har *newCell = 0
33120 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
33130 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
33140 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
33150 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
33160 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
33170 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
33180 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
33190 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
331a0 77 72 46 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d  wrFlag );.  rc =
331b0 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e   checkForReadCon
331c0 66 6c 69 63 74 73 28 70 43 75 72 2d 3e 70 42 74  flicts(pCur->pBt
331d0 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
331e0 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29  oot, pCur, nKey)
331f0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20 20 20  ;.  if( rc ){   
33200 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 2f            .    /
33210 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72  * The table pCur
33220 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61   points to has a
33230 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
33240 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
33250 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
33260 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20 72  EDCACHE );.    r
33270 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
33280 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
33290 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
332a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
332b0 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20  r->skip;.  }..  
332c0 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
332d0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
332e0 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  er cursors open 
332f0 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 20  on this table.. 
33300 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65   **.  ** In some
33310 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c   cases, the call
33320 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
33330 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69  Moveto() below i
33340 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20  s a no-op. For. 
33350 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65   ** example, whe
33360 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61  n inserting data
33370 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69   into a table wi
33380 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  th auto-generate
33390 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b  d integer.  ** k
333a0 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61  eys, the VDBE la
333b0 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69  yer invokes sqli
333c0 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74  te3BtreeLast() t
333d0 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
333e0 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b   .  ** integer k
333f0 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68  ey to use. It th
33400 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  en calls this fu
33410 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c  nction to actual
33420 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20  ly insert the . 
33430 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68   ** data into th
33440 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e  e intkey B-Tree.
33450 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 71   In this case sq
33460 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
33470 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20  () recognizes.  
33480 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
33490 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 77 68  or is already wh
334a0 65 72 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  ere it needs to 
334b0 62 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77  be and returns w
334c0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e  ithout.  ** doin
334d0 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61  g any work. To a
334e0 76 6f 69 64 20 74 68 77 61 72 74 69 6e 67 20 74  void thwarting t
334f0 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
33500 6e 73 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ns, it is import
33510 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  ant.  ** not to 
33520 63 6c 65 61 72 20 74 68 65 20 63 75 72 73 6f 72  clear the cursor
33530 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   here..  */.  if
33540 28 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  (.    SQLITE_OK!
33550 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
33560 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
33570 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
33580 29 20 7c 7c 20 28 21 6c 6f 63 20 26 26 0a 20 20  ) || (!loc &&.  
33590 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
335a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
335b0 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79  oveto(pCur, pKey
335c0 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69  , nKey, appendBi
335d0 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 29 7b  as, &loc)).  )){
335e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
335f0 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
33600 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
33610 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
33620 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
33630 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  y || nKey>=0 );.
33640 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
33650 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e  >intKey || nKey>
33660 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
33670 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
33680 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
33690 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52  .  TRACE(("INSER
336a0 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79  T: table=%d nkey
336b0 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70  =%lld ndata=%d p
336c0 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  age=%d %s\n",.  
336d0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67          pCur->pg
336e0 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44  noRoot, nKey, nD
336f0 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ata, pPage->pgno
33700 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d  ,.          loc=
33710 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22  =0 ? "overwrite"
33720 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29   : "new entry"))
33730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
33740 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
33750 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
33760 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c  (pBt);.  newCell
33770 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
33780 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  e;.  if( newCell
33790 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
337a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
337b0 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
337c0 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
337d0 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
337e0 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73  nData, nZero, &s
337f0 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
33800 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
33810 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
33820 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
33830 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
33840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
33850 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
33860 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d  (pBt) );.  idx =
33870 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
33880 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28  r->iPage];.  if(
33890 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f   loc==0 && CURSO
338a0 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
338b0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36  State ){.    u16
338c0 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65   szOld;.    asse
338d0 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e  rt( idx<pPage->n
338e0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
338f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33900 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
33910 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
33920 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
33930 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
33940 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
33950 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
33960 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
33970 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
33980 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
33990 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
339a0 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
339b0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
339c0 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
339d0 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
339e0 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
339f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
33a00 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
33a10 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c     rc = dropCell
33a20 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f  (pPage, idx, szO
33a30 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ld);.    if( rc!
33a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20  =SQLITE_OK ) {. 
33a50 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
33a60 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  sert;.    }.  }e
33a70 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
33a80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
33a90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
33aa0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
33ab0 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
33ac0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
33ad0 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e];.  }else{.   
33ae0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
33af0 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
33b00 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
33b10 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c  age, idx, newCel
33b20 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
33b30 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
33b40 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
33b50 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50  e->nCell>0 || pP
33b60 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
33b70 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20   );..  /* If no 
33b80 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
33b90 64 20 61 6e 64 20 70 50 61 67 65 20 68 61 73 20  d and pPage has 
33ba0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  an overflow cell
33bb0 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29  , call balance()
33bc0 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74   .  ** to redist
33bd0 72 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73  ribute the cells
33be0 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 65 65   within the tree
33bf0 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28  . Since balance(
33c00 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20  ) may move.  ** 
33c10 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f  the cursor, zero
33c20 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e   the BtCursor.in
33c30 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43  fo.nSize and BtC
33c40 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a  ursor.validNKey.
33c50 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a    ** variables..
33c60 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f    **.  ** Previo
33c70 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  us versions of S
33c80 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76  QLite called mov
33c90 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76  eToRoot() to mov
33ca0 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a  e the cursor.  *
33cb0 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f  * back to the ro
33cc0 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e  ot page as balan
33cd0 63 65 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76  ce() used to inv
33ce0 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74  alidate the cont
33cf0 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43  ents.  ** of BtC
33d00 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61  ursor.apPage[] a
33d10 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  nd BtCursor.aiId
33d20 78 5b 5d 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  x[]. This is no 
33d30 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
33d40 2c 0a 20 20 2a 2a 20 61 73 20 62 61 6c 61 6e 63  ,.  ** as balanc
33d50 65 28 29 20 61 6c 77 61 79 73 20 6c 65 61 76 65  e() always leave
33d60 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  s the cursor poi
33d70 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
33d80 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   entry..  **.  *
33d90 2a 20 54 68 65 72 65 20 69 73 20 61 20 73 75 62  * There is a sub
33da0 74 6c 65 20 62 75 74 20 69 6d 70 6f 72 74 61 6e  tle but importan
33db0 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68  t optimization h
33dc0 65 72 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e  ere too. When in
33dd0 73 65 72 74 69 6e 67 0a 20 20 2a 2a 20 6d 75 6c  serting.  ** mul
33de0 74 69 70 6c 65 20 72 65 63 6f 72 64 73 20 69 6e  tiple records in
33df0 74 6f 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74  to an intkey b-t
33e00 72 65 65 20 75 73 69 6e 67 20 61 20 73 69 6e 67  ree using a sing
33e10 6c 65 20 63 75 72 73 6f 72 20 28 61 73 20 63 61  le cursor (as ca
33e20 6e 0a 20 20 2a 2a 20 68 61 70 70 65 6e 20 77 68  n.  ** happen wh
33e30 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61  ile processing a
33e40 6e 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e  n "INSERT INTO .
33e50 2e 2e 20 53 45 4c 45 43 54 22 20 73 74 61 74 65  .. SELECT" state
33e60 6d 65 6e 74 29 2c 20 69 74 0a 20 20 2a 2a 20 69  ment), it.  ** i
33e70 73 20 61 64 76 61 6e 74 61 67 65 6f 75 73 20 74  s advantageous t
33e80 6f 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73  o leave the curs
33e90 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
33ea0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
33eb0 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65  .  ** the b-tree
33ec0 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 49 66   if possible. If
33ed0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
33ee0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
33ef0 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 65 6e  the last.  ** en
33f00 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
33f10 2c 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 72  , and the next r
33f20 6f 77 20 69 6e 73 65 72 74 65 64 20 68 61 73 20  ow inserted has 
33f30 61 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 20  an integer key. 
33f40 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20   ** larger than 
33f50 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73  the largest exis
33f60 74 69 6e 67 20 6b 65 79 2c 20 69 74 20 69 73 20  ting key, it is 
33f70 70 6f 73 73 69 62 6c 65 20 74 6f 20 69 6e 73 65  possible to inse
33f80 72 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20  rt the.  ** row 
33f90 77 69 74 68 6f 75 74 20 73 65 65 6b 69 6e 67 20  without seeking 
33fa0 74 68 65 20 63 75 72 73 6f 72 2e 20 54 68 69 73  the cursor. This
33fb0 20 63 61 6e 20 62 65 20 61 20 62 69 67 20 70 65   can be a big pe
33fc0 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e  rformance boost.
33fd0 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 69 6e  .  */.  pCur->in
33fe0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
33ff0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
34000 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
34010 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
34020 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  e->nOverflow ){.
34030 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74      pCur->atLast
34040 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62   = 0;.    rc = b
34050 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20  alance(pCur);.. 
34060 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20     /* Must make 
34070 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69  sure nOverflow i
34080 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20  s reset to zero 
34090 65 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61  even if the bala
340a0 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69  nce().    ** fai
340b0 6c 73 2e 20 20 49 6e 74 65 72 6e 61 6c 20 64 61  ls.  Internal da
340c0 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ta structure cor
340d0 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  ruption will res
340e0 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a  ult otherwise. *
340f0 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  /.    pCur->apPa
34100 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
34110 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
34120 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
34130 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
34140 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c  >iPage]->nOverfl
34150 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e  ow==0 );..end_in
34160 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  sert:.  return r
34170 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
34180 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
34190 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
341a0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
341b0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
341c0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
341d0 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61  a arbitrary loca
341e0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
341f0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
34200 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
34210 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
34220 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
34230 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
34240 20 69 6e 74 20 69 64 78 3b 0a 20 20 75 6e 73 69   int idx;.  unsi
34250 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
34260 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  ;.  int rc;.  Pg
34270 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30  no pgnoChild = 0
34280 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
34290 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
342a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
342b0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
342c0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
342d0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
342e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
342f0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
34300 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
34310 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
34320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
34330 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
34340 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
34350 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
34360 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
34370 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20  Cur->skip;.  }. 
34380 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
34390 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
343a0 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
343b0 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  l) ){.    return
343c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20   SQLITE_ERROR;  
343d0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  /* The cursor is
343e0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
343f0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
34400 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
34410 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 72 63 20  >wrFlag );.  rc 
34420 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f  = checkForReadCo
34430 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72 2d  nflicts(p, pCur-
34440 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c  >pgnoRoot, pCur,
34450 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
34460 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
34470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
34480 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
34490 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
344a0 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
344b0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
344c0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
344d0 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65  DCACHE );.    re
344e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
344f0 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  /* Restore the c
34500 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
34510 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20  sition (a no-op 
34520 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
34530 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55   not in .  ** CU
34540 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
34550 20 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65   state) and save
34560 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
34570 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
34580 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f  ors .  ** open o
34590 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
345a0 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69  . Then call sqli
345b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
345c0 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a  on the page.  **
345d0 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
345e0 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
345f0 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  from..  */.  if(
34600 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74   .    (rc = rest
34610 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
34620 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20  n(pCur))!=0 ||. 
34630 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c     (rc = saveAll
34640 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
34650 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
34660 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
34670 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34680 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
34690 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20  Page))!=0.  ){. 
346a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
346b0 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
346c0 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69  he cell within i
346d0 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  ts page and leav
346e0 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
346f0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
34700 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
34710 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
34720 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
34730 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
34740 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
34750 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
34760 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
34770 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43  .  */.  idx = pC
34780 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
34790 69 50 61 67 65 5d 3b 0a 20 20 70 43 65 6c 6c 20  iPage];.  pCell 
347a0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
347b0 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70  , idx);.  if( !p
347c0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
347d0 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
347e0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
347f0 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43   }.  rc = clearC
34800 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
34810 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
34820 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34830 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
34840 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a  >leaf ){.    /*.
34850 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79      ** The entry
34860 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
34870 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61   delete is not a
34880 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64   leaf so if we d
34890 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20  o not.    ** do 
348a0 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c  something we wil
348b0 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f  l leave a hole o
348c0 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61  n an internal pa
348d0 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61  ge..    ** We ha
348e0 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68  ve to fill the h
348f0 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e  ole by moving in
34900 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c   a cell from a l
34910 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  eaf.  The.    **
34920 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72   next Cell after
34930 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64   the one to be d
34940 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e  eleted is guaran
34950 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e  teed to exist an
34960 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61  d.    ** to be a
34970 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20   leaf so we can 
34980 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
34990 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66     BtCursor leaf
349a0 43 75 72 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  Cur;.    MemPage
349b0 20 2a 70 4c 65 61 66 50 61 67 65 20 3d 20 30 3b   *pLeafPage = 0;
349c0 0a 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ..    unsigned c
349d0 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
349e0 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
349f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
34a00 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  tempCell = 0;.  
34a10 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
34a20 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ->intKey );.    
34a30 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
34a40 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
34a50 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72  &leafCur);.    r
34a60 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
34a70 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
34a80 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
34a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34aa0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
34ab0 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 6c   leafCur.aiIdx[l
34ac0 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30  eafCur.iPage]==0
34ad0 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 50   );.      pLeafP
34ae0 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61 70  age = leafCur.ap
34af0 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50 61  Page[leafCur.iPa
34b00 67 65 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ge];.      rc = 
34b10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34b20 65 28 70 4c 65 61 66 50 61 67 65 2d 3e 70 44 62  e(pLeafPage->pDb
34b30 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
34b40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34b50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
34b60 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
34b70 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 31 36  d = 0;.      u16
34b80 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20 20 54   szNext;.      T
34b90 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
34ba0 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69  able=%d delete i
34bb0 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20  nternal from %d 
34bc0 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61  replace from lea
34bd0 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
34be0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
34bf0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
34c00 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 29 29  LeafPage->pgno))
34c10 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  ;.      dropCell
34c20 28 70 50 61 67 65 2c 20 69 64 78 2c 20 63 65 6c  (pPage, idx, cel
34c30 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
34c40 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70  pCell));.      p
34c50 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Next = findCell(
34c60 70 4c 65 61 66 50 61 67 65 2c 20 30 29 3b 0a 20  pLeafPage, 0);. 
34c70 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
34c80 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61 66 50  llSizePtr(pLeafP
34c90 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20  age, pNext);.   
34ca0 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45     assert( MX_CE
34cb0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a  LL_SIZE(pBt)>=sz
34cc0 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20  Next+4 );.      
34cd0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
34ce0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 74 65  e(pBt);.      te
34cf0 6d 70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  mpCell = pBt->pT
34d00 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 69  mpSpace;.      i
34d10 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29  f( tempCell==0 )
34d20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
34d30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
34d40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
34d50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34d60 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73          rc = ins
34d70 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ertCell(pPage, i
34d80 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e  dx, pNext-4, szN
34d90 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c  ext+4, tempCell,
34da0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20   0);.      }... 
34db0 20 20 20 20 20 2f 2a 20 54 68 65 20 22 69 66 22       /* The "if"
34dc0 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
34dd0 65 20 6e 65 78 74 20 63 6f 64 65 20 62 6c 6f 63  e next code bloc
34de0 6b 20 69 73 20 63 72 69 74 69 63 61 6c 2e 20 20  k is critical.  
34df0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 6c 69  The.      ** sli
34e00 67 68 74 65 73 74 20 65 72 72 6f 72 20 69 6e 20  ghtest error in 
34e10 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 77  that statement w
34e20 6f 75 6c 64 20 61 6c 6c 6f 77 20 53 51 4c 69 74  ould allow SQLit
34e30 65 20 74 6f 20 6f 70 65 72 61 74 65 0a 20 20 20  e to operate.   
34e40 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20     ** correctly 
34e50 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 69 6d 65  most of the time
34e60 20 62 75 74 20 70 72 6f 64 75 63 65 20 76 65 72   but produce ver
34e70 79 20 72 61 72 65 20 66 61 69 6c 75 72 65 73 2e  y rare failures.
34e80 20 20 54 6f 0a 20 20 20 20 20 20 2a 2a 20 67 75    To.      ** gu
34e90 61 72 64 20 61 67 61 69 6e 73 74 20 74 68 69 73  ard against this
34ea0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
34eb0 6d 61 63 72 6f 73 20 68 65 6c 70 20 74 6f 20 76  macros help to v
34ec0 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 20  erify that.     
34ed0 20 2a 2a 20 74 68 65 20 22 69 66 22 20 73 74 61   ** the "if" sta
34ee0 74 65 6d 65 6e 74 20 69 73 20 77 65 6c 6c 20 74  tement is well t
34ef0 65 73 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ested..      */.
34f00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34f10 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34f20 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
34f30 72 65 65 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53  ree<pBt->usableS
34f40 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20 20 20  ize*2/3 .       
34f50 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
34f60 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
34f70 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
34f80 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
34f90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34fa0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34fb0 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
34fc0 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ree==pBt->usable
34fd0 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20 20  Size*2/3 .      
34fe0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c             && pL
34ff0 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
35000 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75  +szNext > pBt->u
35010 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
35020 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
35030 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
35040 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  w==0 && pPage->n
35050 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c  Free==pBt->usabl
35060 65 53 69 7a 65 2a 32 2f 33 2b 31 20 0a 20 20 20  eSize*2/3+1 .   
35070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
35080 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
35090 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74  e+2+szNext > pBt
350a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
350b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
350c0 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  se( pPage->nOver
350d0 66 6c 6f 77 3e 30 20 26 26 20 70 50 61 67 65 2d  flow>0 && pPage-
350e0 3e 6e 46 72 65 65 3c 3d 70 42 74 2d 3e 75 73 61  >nFree<=pBt->usa
350f0 62 6c 65 53 69 7a 65 2a 32 2f 33 0a 20 20 20 20  bleSize*2/3.    
35100 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
35110 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
35120 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d  +2+szNext > pBt-
35130 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
35140 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
35150 65 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72  e( (pPage->nOver
35160 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67 65  flow>0 || (pPage
35170 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e 75  ->nFree > pBt->u
35180 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29 0a  sableSize*2/3)).
35190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351a0 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e   && pLeafPage->n
351b0 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d  Free+2+szNext ==
351c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
351d0 2a 32 2f 33 20 29 3b 0a 0a 0a 20 20 20 20 20 20  *2/3 );...      
351e0 69 66 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65  if( (pPage->nOve
351f0 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67  rflow>0 || (pPag
35200 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e  e->nFree > pBt->
35210 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29  usableSize*2/3))
35220 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 70   &&.          (p
35230 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b  LeafPage->nFree+
35240 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e  2+szNext > pBt->
35250 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 0a  usableSize*2/3).
35260 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
35270 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
35280 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
35290 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73  internal node is
352a0 20 6e 6f 77 20 65 69 74 68 65 72 20 6f 76 65 72   now either over
352b0 66 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 20 20  flowing.        
352c0 2a 2a 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20  ** or underfull 
352d0 61 6e 64 20 74 68 65 20 6c 65 61 66 20 6e 6f 64  and the leaf nod
352e0 65 20 77 69 6c 6c 20 62 65 20 75 6e 64 65 72 66  e will be underf
352f0 75 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6a 75  ull after the ju
35300 73 74 20 63 65 6c 6c 20 0a 20 20 20 20 20 20 20  st cell .       
35310 20 2a 2a 20 63 6f 70 69 65 64 20 74 6f 20 74 68   ** copied to th
35320 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
35330 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
35340 69 74 2e 20 54 68 69 73 20 69 73 20 61 20 73 70  it. This is a sp
35350 65 63 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  ecial.        **
35360 20 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68   case because th
35370 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  e call to balanc
35380 65 28 29 20 74 6f 20 63 6f 72 72 65 63 74 20 74  e() to correct t
35390 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
353a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
353b0 63 68 61 6e 67 65 20 74 68 65 20 74 72 65 65 20  change the tree 
353c0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 69 6e  structure and in
353d0 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e  validate the con
353e0 74 65 6e 74 73 20 6f 66 0a 20 20 20 20 20 20 20  tents of.       
353f0 20 2a 2a 20 74 68 65 20 6c 65 61 66 43 75 72 2e   ** the leafCur.
35400 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61  apPage[] and lea
35410 66 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72  fCur.aiIdx[] arr
35420 61 79 73 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  ays, which will 
35430 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  be.        ** us
35440 65 64 20 62 79 20 74 68 65 20 62 61 6c 61 6e 63  ed by the balanc
35450 65 28 29 20 72 65 71 75 69 72 65 64 20 74 6f 20  e() required to 
35460 63 6f 72 72 65 63 74 20 74 68 65 20 75 6e 64 65  correct the unde
35470 72 66 75 6c 6c 20 6c 65 61 66 0a 20 20 20 20 20  rfull leaf.     
35480 20 20 20 2a 2a 20 6e 6f 64 65 2e 0a 20 20 20 20     ** node..    
35490 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
354a0 2a 20 54 68 65 20 66 6f 72 6d 75 6c 61 20 75 73  * The formula us
354b0 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
354c0 73 69 6f 6e 20 61 62 6f 76 65 20 61 72 65 20 62  sion above are b
354d0 61 73 65 64 20 6f 6e 20 66 61 63 65 74 73 20 6f  ased on facets o
354e0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
354f0 20 53 51 4c 69 74 65 20 66 69 6c 65 2d 66 6f 72   SQLite file-for
35500 6d 61 74 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  mat that do not 
35510 63 68 61 6e 67 65 20 6f 76 65 72 20 74 69 6d 65  change over time
35520 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
35530 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
35540 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74  Page->nFree==pBt
35550 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
35560 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  +1 );.        te
35570 73 74 63 61 73 65 28 20 70 4c 65 61 66 50 61 67  stcase( pLeafPag
35580 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
35590 74 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t==pBt->usableSi
355a0 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20  ze*2/3+1 );.    
355b0 20 20 20 20 6c 65 61 66 43 75 72 73 6f 72 49 6e      leafCursorIn
355c0 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  valid = 1;.     
355d0 20 7d 20 20 20 20 20 20 20 20 0a 0a 20 20 20 20   }        ..    
355e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
355f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
35600 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
35610 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35620 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
35630 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
35640 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
35650 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 2c  ell(pPage, idx),
35660 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20   pgnoChild);.   
35670 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70       VVA_ONLY( p
35680 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
35690 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20  ed = 0 );.      
356a0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
356b0 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Cur);.      }.. 
356c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
356d0 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75  ITE_OK && leafCu
356e0 72 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20  rsorInvalid ){. 
356f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
35700 61 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75  af-node is now u
35710 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20  nderfull and so 
35720 74 68 65 20 74 72 65 65 20 6e 65 65 64 73 20 74  the tree needs t
35730 6f 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  o be .        **
35740 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77   rebalanced. How
35750 65 76 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63  ever, the balanc
35760 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  e() operation on
35770 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20   the internal.  
35780 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62        ** node ab
35790 6f 76 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64  ove may have mod
357a0 69 66 69 65 64 20 74 68 65 20 73 74 72 75 63 74  ified the struct
357b0 75 72 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65  ure of the B-Tre
357c0 65 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  e and.        **
357d0 20 73 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   so the current 
357e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66  contents of leaf
357f0 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
35800 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d   leafCur.aiIdx[]
35810 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
35820 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
35830 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
35840 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20     ** It is not 
35850 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79  possible to copy
35860 20 74 68 65 20 61 6e 63 65 73 74 72 79 20 66 72   the ancestry fr
35870 6f 6d 20 70 43 75 72 2c 20 61 73 20 74 68 65 20  om pCur, as the 
35880 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  same.        ** 
35890 62 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68  balance() call h
358a0 61 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74  as invalidated t
358b0 68 65 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  he pCur->apPage[
358c0 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20  ] and aiIdx[].  
358d0 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e        ** arrays.
358e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
358f0 20 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c       ** The call
35900 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f   to saveCursorPo
35910 73 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69  sition() below i
35920 6e 74 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20  nternally saves 
35930 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
35940 6b 65 79 20 74 68 61 74 20 6c 65 61 66 43 75 72  key that leafCur
35950 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
35960 69 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65  inting to. Curre
35970 6e 74 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20  ntly, there.    
35980 20 20 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63      ** are two c
35990 6f 70 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65  opies of that ke
359a0 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20  y in the tree - 
359b0 6f 6e 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20  one here on the 
359c0 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  leaf.        ** 
359d0 70 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20  page and one on 
359e0 73 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  some internal no
359f0 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20  de in the tree. 
35a00 54 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20  The copy on.    
35a10 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20      ** the leaf 
35a20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 74  node is always t
35a30 68 65 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74  he next key in t
35a40 72 65 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20  ree-order after 
35a50 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
35a60 63 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65  copy on the inte
35a70 72 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74  rnal node. So, t
35a80 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
35a90 65 33 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20  e3BtreeNext().  
35aa0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72        ** calls r
35ab0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
35ac0 74 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20  tion() to point 
35ad0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
35ae0 65 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a  e copy.        *
35af0 2a 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  * stored on the 
35b00 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74  internal node, t
35b10 68 65 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20  hen advances to 
35b20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a  the next entry,.
35b30 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68          ** which
35b40 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
35b50 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b  he copy of the k
35b60 65 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e  ey on the intern
35b70 61 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20  al node..       
35b80 20 2a 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20   ** Net effect: 
35b90 6c 65 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74  leafCur is point
35ba0 69 6e 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ing back to the 
35bb0 64 75 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20  duplicate cell. 
35bc0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e         ** that n
35bd0 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76  eeds to be remov
35be0 65 64 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ed, and the leaf
35bf0 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
35c00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66  .        ** leaf
35c10 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61  Cur.aiIdx[] arra
35c20 79 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a  ys are correct..
35c30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
35c40 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e     VVA_ONLY( Pgn
35c50 6f 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65  o leafPgno = pLe
35c60 61 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  afPage->pgno );.
35c70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
35c80 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
35c90 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20  &leafCur);.     
35ca0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35cb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35cc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
35cd0 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
35ce0 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
35cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
35d00 4c 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43  LeafPage = leafC
35d10 75 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75  ur.apPage[leafCu
35d20 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20  r.iPage];.      
35d30 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
35d40 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 4c 65 61 66  LITE_OK || pLeaf
35d50 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66  Page->pgno==leaf
35d60 50 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20  Pgno );.        
35d70 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
35d80 54 45 5f 4f 4b 20 7c 7c 20 6c 65 61 66 43 75 72  TE_OK || leafCur
35d90 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69  .aiIdx[leafCur.i
35da0 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  Page]==0 );.    
35db0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 53    }..      if( S
35dc0 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20  QLITE_OK==rc.   
35dd0 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
35de0 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ==(rc = sqlite3P
35df0 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50  agerWrite(pLeafP
35e00 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 0a  age->pDbPage)) .
35e10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
35e20 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50   dropCell(pLeafP
35e30 61 67 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b  age, 0, szNext);
35e40 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  .        VVA_ONL
35e50 59 28 20 6c 65 61 66 43 75 72 2e 70 61 67 65 73  Y( leafCur.pages
35e60 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a  Shuffled = 0 );.
35e70 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
35e80 61 6e 63 65 28 26 6c 65 61 66 43 75 72 29 3b 0a  ance(&leafCur);.
35e90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35ea0 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
35eb0 64 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e 70 61  d || !leafCur.pa
35ec0 67 65 73 53 68 75 66 66 6c 65 64 0a 20 20 20 20  gesShuffled.    
35ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
35ef0 7c 20 21 70 43 75 72 2d 3e 70 61 67 65 73 53 68  | !pCur->pagesSh
35f00 75 66 66 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  uffled );.      
35f10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
35f20 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54  te3BtreeReleaseT
35f30 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43  empCursor(&leafC
35f40 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
35f50 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
35f60 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
35f70 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
35f80 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ",.       pCur->
35f90 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
35fa0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20  >pgno));.    rc 
35fb0 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65  = dropCell(pPage
35fc0 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  , idx, cellSizeP
35fd0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
35fe0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
35ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36000 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
36010 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
36020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36030 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
36040 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
36050 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36060 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
36070 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
36080 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
36090 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
360a0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
360b0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
360c0 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
360d0 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
360e0 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
360f0 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
36100 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
36110 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
36120 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
36130 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
36140 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
36150 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
36160 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
36170 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
36180 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
36190 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
361a0 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
361b0 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
361c0 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
361d0 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
361e0 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
361f0 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73  SQL indices.*/.s
36200 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
36210 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
36220 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
36230 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
36240 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
36250 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
36260 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
36270 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
36280 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
36290 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
362a0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
362b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
362c0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
362d0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
362e0 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
362f0 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  nly );..#ifdef S
36300 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
36310 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c  ACUUM.  rc = all
36320 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
36330 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
36340 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
36350 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
36360 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
36370 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  se.  if( pBt->au
36380 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
36390 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20  Pgno pgnoMove;  
363a0 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61      /* Move a pa
363b0 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20  ge here to make 
363c0 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f  room for the roo
363d0 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65  t-page */.    Me
363e0 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65  mPage *pPageMove
363f0 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f  ; /* The page to
36400 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20   move to. */..  
36410 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20    /* Creating a 
36420 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72  new table may pr
36430 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d  obably require m
36440 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  oving an existin
36450 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  g database.    *
36460 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  * to make room f
36470 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
36480 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20  s root page. In 
36490 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74  case this page t
364a0 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20  urns.    ** out 
364b0 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  to be an overflo
364c0 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61  w page, delete a
364d0 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ll overflow page
364e0 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20  -map caches.    
364f0 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20  ** held by open 
36500 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a  cursors..    */.
36510 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
36520 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
36530 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  Bt);..    /* Rea
36540 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
36550 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
36560 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
36570 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
36580 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
36590 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
365a0 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
365b0 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
365c0 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
365d0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
365e0 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
365f0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
36600 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
36610 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36620 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
36630 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52   BTREE_LARGEST_R
36640 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67 6e 6f 52  OOT_PAGE, &pgnoR
36650 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  oot);.    if( rc
36660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36670 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36680 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f      }.    pgnoRo
36690 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ot++;..    /* Th
366a0 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
366b0 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63  may not be alloc
366c0 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65  ated on a pointe
366d0 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74  r-map page, or t
366e0 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e  he.    ** PENDIN
366f0 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20  G_BYTE page..   
36700 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
36710 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f  gnoRoot==PTRMAP_
36720 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f  PAGENO(pBt, pgno
36730 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20  Root) ||.       
36740 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49   pgnoRoot==PENDI
36750 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
36760 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52  ) ){.      pgnoR
36770 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  oot++;.    }.   
36780 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f   assert( pgnoRoo
36790 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  t>=3 );..    /* 
367a0 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e  Allocate a page.
367b0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
367c0 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73  urrently resides
367d0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c   at pgnoRoot wil
367e0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65  l.    ** be move
367f0 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  d to the allocat
36800 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20  ed page (unless 
36810 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
36820 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a  ge happens.    *
36830 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20 70  * to reside at p
36840 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f  gnoRoot)..    */
36850 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
36860 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
36870 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67   &pPageMove, &pg
36880 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74  noMove, pgnoRoot
36890 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
368a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
368b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
368c0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
368d0 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f  gnoMove!=pgnoRoo
368e0 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67  t ){.      /* pg
368f0 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61  noRoot is the pa
36900 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ge that will be 
36910 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  used for the roo
36920 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20  t-page of.      
36930 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
36940 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72   (assuming an er
36950 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75  ror did not occu
36960 72 29 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a  r). But we were.
36970 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
36980 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20  ed pgnoMove. If 
36990 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69  required (i.e. i
369a0 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c  f it was not all
369b0 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ocated.      ** 
369c0 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65  by extending the
369d0 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72   file), the curr
369e0 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73 69  ent page at posi
369f0 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20  tion pgnoMove.  
36a00 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64      ** is alread
36a10 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20  y journaled..   
36a20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65     */.      u8 e
36a30 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Type;.      Pgno
36a40 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
36a50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
36a60 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20  ageMove);..     
36a70 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67   /* Move the pag
36a80 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70  e currently at p
36a90 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d  gnoRoot to pgnoM
36aa0 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ove. */.      rc
36ab0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
36ac0 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
36ad0 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
36ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
36af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36b00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
36b20 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
36b30 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79  , pgnoRoot, &eTy
36b40 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
36b50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36b60 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65  LITE_OK || eType
36b70 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
36b80 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
36b90 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
36ba0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
36bb0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
36bc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
36bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
36be0 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
36bf0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
36c00 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
36c10 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e!=PTRMAP_FREEPA
36c20 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  GE );.      rc =
36c30 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
36c40 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c  t, pRoot, eType,
36c50 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d   iPtrPage, pgnoM
36c60 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ove, 0);.      r
36c70 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
36c80 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  );..      /* Obt
36c90 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20  ain the page at 
36ca0 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20  pgnoRoot */.    
36cb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
36cd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36ce0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
36cf0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
36d00 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
36d10 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
36d20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36d30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
36d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36d50 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
36d60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36d70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
36d80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36da0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
36db0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
36dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36dd0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
36de0 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65     pRoot = pPage
36df0 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20  Move;.    } ..  
36e00 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
36e10 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20  pointer-map and 
36e20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74  meta-data with t
36e30 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
36e40 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   number. */.    
36e50 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
36e60 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54  Bt, pgnoRoot, PT
36e70 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
36e80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
36e90 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
36ea0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
36eb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36ec0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
36ed0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
36ee0 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74  a(p, 4, pgnoRoot
36ef0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
36f00 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
36f10 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
36f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36f30 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
36f40 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
36f50 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
36f60 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
36f70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
36f80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36f90 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
36fa0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
36fb0 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
36fc0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
36fd0 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
36fe0 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46  flags | PTF_LEAF
36ff0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
37000 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44  rUnref(pRoot->pD
37010 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62  bPage);.  *piTab
37020 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f  le = (int)pgnoRo
37030 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ot;.  return SQL
37040 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
37050 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
37060 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
37070 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
37080 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
37090 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
370a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
370b0 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61   = btreeCreateTa
370c0 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20  ble(p, piTable, 
370d0 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  flags);.  sqlite
370e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
370f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37100 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
37110 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
37120 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
37130 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
37140 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
37150 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
37160 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
37170 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
37180 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
37190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
371a0 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
371b0 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
371c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
371d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
371e0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
371f0 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65  ar */.  int free
37200 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a  PageFlag,     /*
37210 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65   Deallocate page
37220 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
37230 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20  t *pnChange.){. 
37240 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
37250 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
37260 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
37270 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pCell;.  int i;.
37280 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37290 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
372a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
372b0 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67  f( pgno>pagerPag
372c0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
372d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
372e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
372f0 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   }..  rc = getAn
37300 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
37310 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
37320 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
37330 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
37340 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
37350 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
37360 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
37370 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
37380 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
37390 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
373a0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
373b0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
373c0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
373d0 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
373e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
373f0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
37400 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
37410 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
37420 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
37430 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
37440 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
37450 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
37460 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
37470 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  f ){.    rc = cl
37480 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
37490 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
374a0 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c  Page->aData[8]),
374b0 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
374c0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
374d0 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
374e0 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  ge_out;.  }else 
374f0 69 66 28 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a  if( pnChange ){.
37500 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
37510 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  e->intKey );.   
37520 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50   *pnChange += pP
37530 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  age->nCell;.  }.
37540 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c    if( freePageFl
37550 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ag ){.    rc = f
37560 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
37570 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
37580 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
37590 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
375a0 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ge))==0 ){.    z
375b0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
375c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c  Page->aData[0] |
375d0 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a   PTF_LEAF);.  }.
375e0 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61  .cleardatabasepa
375f0 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  ge_out:.  releas
37600 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
37610 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37620 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69  .** Delete all i
37630 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
37640 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
37650 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
37660 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68   iTable is.** th
37670 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
37680 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
37690 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74   table.  After t
376a0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
376b0 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74  rns,.** the root
376c0 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20   page is empty, 
376d0 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73  but still exists
376e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
376f0 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
37700 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
37710 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
37720 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20  ny open.** read 
37730 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
37740 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74  able.  Open writ
37750 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f  e cursors are mo
37760 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f  ved to the.** ro
37770 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
37780 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e  .**.** If pnChan
37790 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
377a0 74 68 65 6e 20 74 61 62 6c 65 20 69 54 61 62 6c  then table iTabl
377b0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74  e must be an int
377c0 6b 65 79 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a  key table. The.*
377d0 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * integer value 
377e0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 6e  pointed to by pn
377f0 43 68 61 6e 67 65 20 69 73 20 69 6e 63 72 65 6d  Change is increm
37800 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
37810 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65  ber of.** entrie
37820 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
37830 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
37840 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
37850 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
37860 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67  le, int *pnChang
37870 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
37880 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
37890 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
378a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
378b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
378c0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
378d0 45 20 29 3b 0a 20 20 69 66 28 20 28 72 63 20 3d  E );.  if( (rc =
378e0 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e   checkForReadCon
378f0 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
37900 2c 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  , 0, 1))!=SQLITE
37910 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  _OK ){.    /* no
37920 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
37930 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
37940 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
37950 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
37960 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20  iTable, 0)) ){. 
37970 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
37980 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a   do */.  }else{.
37990 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
379a0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
379b0 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c  (Pgno)iTable, 0,
379c0 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a   pnChange);.  }.
379d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
379e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
379f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
37a00 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ase all informat
37a10 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61  ion in a table a
37a20 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20  nd add the root 
37a30 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a  of the table to.
37a40 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
37a50 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f    Except, the ro
37a60 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69  ot of the princi
37a70 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f  ple table (the o
37a80 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29  ne on.** page 1)
37a90 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20   is never added 
37aa0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
37ab0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
37ac0 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
37ad0 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
37ae0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
37af0 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  y open.** cursor
37b00 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
37b10 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  **.** If AUTOVAC
37b20 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61  UUM is enabled a
37b30 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69  nd the page at i
37b40 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65  Table is not the
37b50 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61   last.** root pa
37b60 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
37b70 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
37b80 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
37b90 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61   .** in the data
37ba0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76  base file is mov
37bb0 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74  ed into the slot
37bc0 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
37bd0 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20  ed by.** iTable 
37be0 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c  and that last sl
37bf0 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
37c00 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74  pied by the last
37c10 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
37c20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
37c30 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f  eelist instead o
37c40 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68  f iTable.  In th
37c50 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72  is say, all.** r
37c60 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65  oot pages are ke
37c70 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  pt at the beginn
37c80 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
37c90 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a  ase file, which.
37ca0 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ** is necessary 
37cb0 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74  for AUTOVACUUM t
37cc0 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a  o work right.  *
37cd0 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
37ce0 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e  o the .** page n
37cf0 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20  umber that used 
37d00 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72  to be the last r
37d10 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
37d20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  file before.** t
37d30 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20  he move.  If no 
37d40 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c  page gets moved,
37d50 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
37d60 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61   to 0..** The la
37d70 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  st root page is 
37d80 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61  recorded in meta
37d90 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75  [3] and the valu
37da0 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20  e of.** meta[3] 
37db0 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
37dc0 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f  is procedure..*/
37dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
37de0 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
37df0 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
37e00 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
37e10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
37e20 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
37e30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
37e40 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
37e50 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
37e60 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
37e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
37e80 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
37e90 52 49 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 74  RITE );..  /* It
37ea0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64   is illegal to d
37eb0 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61  rop a table if a
37ec0 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f  ny cursors are o
37ed0 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  pen on the.  ** 
37ee0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
37ef0 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74  s because in aut
37f00 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68  o-vacuum mode th
37f10 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20  e backend may.  
37f20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  ** need to move 
37f30 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67  another root-pag
37f40 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20  e to fill a gap 
37f50 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
37f60 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61  ted.  ** root pa
37f70 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63  ge. If an open c
37f80 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20  ursor was using 
37f90 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62  this page a prob
37fa0 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20  lem would .  ** 
37fb0 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  occur..  */.  if
37fc0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29  ( pBt->pCursor )
37fd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
37fe0 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
37ff0 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 43 75 72 73  ->db, pBt->pCurs
38000 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b  or->pBtree->db);
38010 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
38020 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
38030 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  CACHE;.  }..  rc
38040 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
38050 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
38060 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65  o)iTable, &pPage
38070 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
38080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
38090 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
380a0 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61  learTable(p, iTa
380b0 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ble, 0);.  if( r
380c0 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  c ){.    release
380d0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
380e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
380f0 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b  .  *piMoved = 0;
38100 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31  ..  if( iTable>1
38110 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
38120 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
38130 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  M.    rc = freeP
38140 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
38150 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
38160 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  e);.#else.    if
38170 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
38180 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  m ){.      Pgno 
38190 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20  maxRootPgno;.   
381a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
381b0 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 42  treeGetMeta(p, B
381c0 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f  TREE_LARGEST_ROO
381d0 54 5f 50 41 47 45 2c 20 26 6d 61 78 52 6f 6f 74  T_PAGE, &maxRoot
381e0 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Pgno);.      if(
381f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
38200 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
38210 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
38220 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
38230 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
38240 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52  if( iTable==maxR
38250 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  ootPgno ){.     
38260 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62     /* If the tab
38270 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
38280 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69   is the table wi
38290 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  th the largest r
382a0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
382b0 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
382c0 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20  e database, put 
382d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e  the root page on
382e0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20   the free list. 
382f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
38300 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
38310 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
38320 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
38330 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
38340 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
38350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
38360 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
38370 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
38380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
38390 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
383a0 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  d does not have 
383b0 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
383c0 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
383d0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
383e0 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65  atabase. So move
383f0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64   the page that d
38400 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  oes into the .  
38410 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66        ** gap lef
38420 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64  t by the deleted
38430 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20   root-page..    
38440 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d      */.        M
38450 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20  emPage *pMove;. 
38460 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
38470 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
38480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
38490 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
384a0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
384b0 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
384c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
384d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
384e0 20 72 65 74 75 72 6e 20 72 63 3