/ Hex Artifact Content
Login

Artifact a601a89bcf1fc614babbde0afedbfc83e18e3c02:


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 30 37 20 32 30 30 39 2f 30  c,v 1.607 2009/0
0190: 35 2f 30 34 20 31 39 3a 30 31 3a 32 36 20 64 61  5/04 19:01:26 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 30  ite3BtreeTrace=0
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f....#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  CACHE./*.** A li
0450: 73 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f  st of BtShared o
0460: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
0470: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72  eligible for par
0480: 74 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e  ticipation.** in
0490: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
04a0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
04b0: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72  s file scope dur
04c0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  ing normal build
04d0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65  s,.** but the te
04e0: 73 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73  st harness needs
04f0: 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f   to access it so
0500: 20 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62   we make it glob
0510: 61 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20  al for .** test 
0520: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63  builds..**.** Ac
0530: 63 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72  cess to this var
0540: 69 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74  iable is protect
0550: 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54  ed by SQLITE_MUT
0560: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
0570: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0580: 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64  TE_TEST.BtShared
0590: 20 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c   *SQLITE_WSD sql
05a0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
05b0: 69 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ist = 0;.#else.s
05c0: 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a  tatic BtShared *
05d0: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
05e0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05f0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  t = 0;.#endif.#e
0600: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0610: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0620: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0630: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0640: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0650: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0660: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0670: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0680: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0690: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
06a0: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06c0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06d0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06e0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06f0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
0700: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0710: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0720: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0730: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0740: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0750: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0760: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0770: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0780: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0790: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
07a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
07b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
07c0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
07d0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
07e0: 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 52 65 61   int checkForRea
07f0: 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65  dConflicts(Btree
0800: 2a 2c 20 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f  *, Pgno, BtCurso
0810: 72 2a 2c 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64  r*, i64);...#ifd
0820: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0830: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0840: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0850: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0860: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0870: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0880: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0890: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
08a0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
08b0: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
08c0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
08d0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
08e0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
08f0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0900: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0910: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0920: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0930: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0940: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0950: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0960: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0970: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0980: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0990: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
09a0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
09b0: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
09c0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
09d0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
09e0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
09f0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0a00: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0a10: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0a20: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0a30: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0a40: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0a50: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0a60: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0a70: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0a80: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0a90: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 23  eTableLocks(a).#
0aa0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0ab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ac0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51 75  D_CACHE./*.** Qu
0ad0: 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74  ery to see if bt
0ae0: 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79  ree handle p may
0af0: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
0b00: 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a  f type eLock .**
0b10: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
0b20: 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68  RITE_LOCK) on th
0b30: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
0b40: 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74  t-page iTab. Ret
0b50: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
0b60: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79   if the lock may
0b70: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79   be obtained (by
0b80: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53   calling.** setS
0b90: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ba0: 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54  ock()), or SQLIT
0bb0: 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e  E_LOCKED if not.
0bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71  .*/.static int q
0bd0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
0bf0: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
0c00: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
0c10: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
0c20: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
0c30: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
0c40: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
0c50: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
0c60: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
0c70: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
0c80: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
0c90: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
0ca0: 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
0cb0: 72 65 71 75 65 73 74 69 6e 67 20 61 20 77 72 69  requesting a wri
0cc0: 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  te-lock, then th
0cd0: 65 20 42 74 72 65 65 20 6d 75 73 74 20 68 61 76  e Btree must hav
0ce0: 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a  e an open write.
0cf0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
0d00: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41   on this file. A
0d10: 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66  nd, obviously, f
0d20: 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f  or this to be so
0d30: 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73   there .  ** mus
0d40: 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  t be an open wri
0d50: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
0d60: 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  n the file itsel
0d70: 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  f..  */.  assert
0d80: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
0d90: 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70  CK || (p==pBt->p
0da0: 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54  Writer && p->inT
0db0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
0dc0: 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
0dd0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
0de0: 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
0df0: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
0e00: 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  ITE );.  .  /* T
0e10: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
0e20: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
0e30: 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  he is not enable
0e40: 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73  d */.  if( !p->s
0e50: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72  harable ){.    r
0e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0e70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  .  }..  /* If so
0e80: 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
0e90: 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ion is holding a
0ea0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
0eb0: 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65  , the.  ** reque
0ec0: 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f  sted lock may no
0ed0: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20  t be obtained.. 
0ee0: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
0ef0: 57 72 69 74 65 72 21 3d 70 20 26 26 20 70 42 74  Writer!=p && pBt
0f00: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ->isExclusive ){
0f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
0f20: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
0f30: 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65  >db, pBt->pWrite
0f40: 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  r->db);.    retu
0f50: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
0f60: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
0f70: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61 6c  }..  /* This (al
0f80: 6f 6e 67 20 77 69 74 68 20 73 65 74 53 68 61 72  ong with setShar
0f90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0fa0: 28 29 29 20 69 73 20 77 68 65 72 65 0a 20 20 2a  ()) is where.  *
0fb0: 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  * the ReadUncomm
0fc0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 64 65  itted flag is de
0fd0: 61 6c 74 20 77 69 74 68 2e 0a 20 20 2a 2a 20 49  alt with..  ** I
0fe0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
0ff0: 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72  querying for a r
1000: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 61 6e 79 20  ead-lock on any 
1010: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 74 68 65 72  table.  ** other
1020: 20 74 68 61 6e 20 74 68 65 20 73 71 6c 69 74 65   than the sqlite
1030: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 74  _master table (t
1040: 61 62 6c 65 20 31 29 20 61 6e 64 20 69 66 20 74  able 1) and if t
1050: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
1060: 65 64 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  ed.  ** flag is 
1070: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  set, then the lo
1080: 63 6b 20 67 72 61 6e 74 65 64 20 65 76 65 6e 20  ck granted even 
1090: 69 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69  if there are wri
10a0: 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e  te-locks.  ** on
10b0: 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61   the table. If a
10c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72   write-lock is r
10d0: 65 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65  equested, the Re
10e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
10f0: 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63  ag.  ** is not c
1100: 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a  onsidered..  **.
1110: 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e    ** In function
1120: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
1130: 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 69 66 20 61  ableLock(), if a
1140: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65   read-lock is de
1150: 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20 0a  manded and the .
1160: 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69    ** ReadUncommi
1170: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
1180: 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61 64  , no entry is ad
1190: 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73  ded to the locks
11a0: 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74 53   list .  ** (BtS
11b0: 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20  hared.pLock)..  
11c0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61  **.  ** To summa
11d0: 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65 61  rize: If the Rea
11e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
11f0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72  g is set, then r
1200: 65 61 64 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ead cursors.  **
1210: 20 6f 6e 20 6e 6f 6e 2d 73 63 68 65 6d 61 20 74   on non-schema t
1220: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 63 72 65  ables do not cre
1230: 61 74 65 20 6f 72 20 72 65 73 70 65 63 74 20 74  ate or respect t
1240: 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20  able locks. The 
1250: 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 70 72 6f  locking.  ** pro
1260: 63 65 64 75 72 65 20 66 6f 72 20 61 20 77 72 69  cedure for a wri
1270: 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e  te-cursor does n
1280: 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  ot change..  */.
1290: 20 20 69 66 28 20 0a 20 20 20 20 30 3d 3d 28 70    if( .    0==(p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
12b0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
12c0: 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63  ed) || .    eLoc
12d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
12e0: 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45  .    iTab==MASTE
12f0: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1300: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1310: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1320: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1330: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
1340: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
1350: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
1360: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1370: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 20 20 2a  if(...) .      *
1380: 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  * statement is a
1390: 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
13a0: 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  of:.      **.   
13b0: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
13c0: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
13d0: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
13e0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 2a 2a  E_LOCK).      **
13f0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20  .      ** since 
1400: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20  we know that if 
1410: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1420: 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72  K, then no other
1430: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
1440: 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20    ** may hold a 
1450: 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e  WRITE_LOCK on an
1460: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20  y table in this 
1470: 66 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72  file (since ther
1480: 65 20 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  e can.      ** o
1490: 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  nly be a single 
14a0: 77 72 69 74 65 72 29 2e 0a 20 20 20 20 20 20 2a  writer)..      *
14b0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
14c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
14d0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
14e0: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
14f0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
1500: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
1510: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1520: 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74  pBtree==p || pIt
1530: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
1540: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
1550: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1560: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
1570: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
1580: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
1590: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15a0: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
15b0: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
15c0: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
15d0: 20 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b         if( eLock
15e0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a  ==WRITE_LOCK ){.
15f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1600: 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65  ( p==pBt->pWrite
1610: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
1620: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
1630: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1640: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1650: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1660: 43 41 43 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20  CACHE;.      }. 
1670: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1690: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
16a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16b0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
16c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16d0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
16e0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
16f0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1700: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
1710: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
1720: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
1730: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
1740: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
1750: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
1760: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
1770: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
1780: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1790: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
17a0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
17b0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
17c0: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
17d0: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
17e0: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
17f0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
1800: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1810: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
1820: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1830: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1840: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1850: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
1860: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
1870: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
1880: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1890: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
18a0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
18b0: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
18c0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
18d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
18e0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
18f0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1900: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1910: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1920: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1930: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1950: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
1960: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
1970: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1980: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
1990: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  k) );..  /* If t
19a0: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
19b0: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
19c0: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
19d0: 69 73 20 72 65 71 75 65 73 74 65 64 20 6f 6e 0a  is requested on.
19e0: 20 20 2a 2a 20 61 20 6e 6f 6e 2d 73 63 68 65 6d    ** a non-schem
19f0: 61 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  a table, then th
1a00: 65 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  e lock is always
1a10: 20 67 72 61 6e 74 65 64 2e 20 20 52 65 74 75 72   granted.  Retur
1a20: 6e 20 65 61 72 6c 79 0a 20 20 2a 2a 20 77 69 74  n early.  ** wit
1a30: 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65  hout adding an e
1a40: 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74 53 68  ntry to the BtSh
1a50: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e  ared.pLock list.
1a60: 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e   See.  ** commen
1a70: 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75  t in function qu
1a80: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1a90: 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f  bleLock() for mo
1aa0: 72 65 20 69 6e 66 6f 0a 20 20 2a 2a 20 6f 6e 20  re info.  ** on 
1ab0: 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 52 65 61  handling the Rea
1ac0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
1ad0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
1ae0: 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73     (p->db->flags
1af0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1b00: 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20 20 20  mmitted) && .   
1b10: 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f   (eLock==READ_LO
1b20: 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c  CK) &&.    iTabl
1b30: 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  e!=MASTER_ROOT. 
1b40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1b50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1b60: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
1b70: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
1b80: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
1b90: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
1ba0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1bb0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1bc0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1bd0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
1be0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1bf0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
1c00: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
1c10: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
1c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c30: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1c40: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
1c50: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
1c60: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
1c70: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
1c80: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
1c90: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
1ca0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
1cb0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
1cc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
1cd0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
1ce0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
1cf0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1d00: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
1d10: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
1d20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d40: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
1d50: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
1d60: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
1d70: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
1d80: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1d90: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
1da0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
1db0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
1dc0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
1dd0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
1de0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
1df0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
1e00: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1e10: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
1e20: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
1e30: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
1e40: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
1e50: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
1e60: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
1e70: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
1e80: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
1e90: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
1ea0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
1eb0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
1ec0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
1ed0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
1ee0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
1ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f00: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
1f10: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1f20: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
1f30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1f40: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
1f50: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
1f60: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
1f70: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
1f80: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
1f90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1fa0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
1fb0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1fc0: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2a 0a  ee handle p..**.
1fd0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1fe0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 68 61   assumes that ha
1ff0: 6e 64 6c 65 20 70 20 68 61 73 20 61 6e 20 6f 70  ndle p has an op
2000: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
2010: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
2020: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
2030: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 53 68 61  , then the BtSha
2040: 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 76 61  red.isPending va
2050: 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65  riable.** may be
2060: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c 65   incorrectly cle
2070: 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
2080: 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68 61  void clearAllSha
2090: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
20a0: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
20b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20c0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
20d0: 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74   **ppIter = &pBt
20e0: 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65  ->pLock;..  asse
20f0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2100: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2110: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2120: 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70  arable || 0==*pp
2130: 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  Iter );.  assert
2140: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29  ( p->inTrans>0 )
2150: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49  ;..  while( *ppI
2160: 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  ter ){.    BtLoc
2170: 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74  k *pLock = *ppIt
2180: 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
2190: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
21a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
21b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
21c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
21d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
21e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
21f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
2200: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
2210: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
2220: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
2230: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
2240: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
2250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2260: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
2270: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
2280: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  }..  assert( pBt
2290: 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20 7c  ->isPending==0 |
22a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
22b0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
22c0: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
22d0: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
22e0: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
22f0: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
2300: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
2310: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
2320: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
2330: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
2340: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2350: 61 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e 6e 65  alled when conne
2360: 63 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e 63 6c  ction p is concl
2370: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
2380: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2390: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
23a0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
23b0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
23c0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
23d0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
23e0: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
23f0: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
2400: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
2410: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
2420: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
2430: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
2440: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
2450: 20 73 65 74 20 74 68 65 20 69 73 50 65 6e 64 69   set the isPendi
2460: 6e 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20  ng flag to 0..  
2470: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2480: 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72  here is not curr
2490: 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20  ently a writer, 
24a0: 74 68 65 6e 20 42 74 53 68 61 72 65 64 2e 69 73  then BtShared.is
24b0: 50 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20 20 20  Pending must.   
24c0: 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65   ** be zero alre
24d0: 61 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78  ady. So this nex
24e0: 74 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65  t line is harmle
24f0: 73 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ss in that case.
2500: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
2510: 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  >isPending = 0;.
2520: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
2530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2540: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
2550: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
2560: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2570: 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  age);  /* Forwar
2580: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a  d reference */..
2590: 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  /*.** Verify tha
25a0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
25b0: 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  ds a mutex on th
25c0: 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  e BtShared.*/.#i
25d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
25e0: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f  tic int cursorHo
25f0: 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f  ldsMutex(BtCurso
2600: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
2610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2620: 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
2630: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
2640: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2650: 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a  T_INCRBLOB./*.**
2660: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
2670: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2680: 73 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72  st cache for cur
2690: 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79  sor pCur, if any
26a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26b0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
26c0: 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f  lowCache(BtCurso
26d0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
26e0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26f0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2700: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2710: 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
2720: 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2730: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
2740: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
2750: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
2760: 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63   cache for all c
2770: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
2780: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
2790: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
27a0: 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Bt..*/.static vo
27b0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  id invalidateAll
27c0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
27d0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
27e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
27f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2800: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2810: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70  utex) );.  for(p
2820: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2830: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2840: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
2850: 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20  rflowCache(p);. 
2860: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65   }.}.#else.  #de
2870: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
2880: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
2890: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
28a0: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
28b0: 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a  ache(x).#endif..
28c0: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
28d0: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
28e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
28f0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
2900: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
2910: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
2920: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
2930: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
2940: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
2950: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
2960: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
2970: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
2980: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
2990: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
29a0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
29b0: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
29c0: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
29d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
29e0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
29f0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2a00: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
2a10: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
2a20: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
2a30: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
2a40: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
2a50: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
2a60: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
2a70: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2a80: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
2a90: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
2aa0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
2ab0: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
2ac0: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
2ad0: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
2ae0: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
2af0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
2b00: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
2b10: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
2b20: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
2b30: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
2b40: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
2b50: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
2b60: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
2b70: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
2b80: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
2b90: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
2ba0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
2bb0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2bc0: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
2bd0: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
2be0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
2bf0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
2c00: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
2c10: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
2c20: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
2c30: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
2c40: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
2c50: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
2c60: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
2c70: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
2c80: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
2c90: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
2ca0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
2cb0: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
2cc0: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
2cd0: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
2ce0: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
2cf0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
2d00: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
2d10: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
2d20: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
2d30: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
2d40: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
2d50: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
2d60: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
2d70: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
2d80: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
2d90: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
2da0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
2db0: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
2dc0: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
2dd0: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
2de0: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
2df0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
2e00: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
2e10: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
2e20: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
2e30: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
2e40: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
2e50: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
2e60: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
2e70: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
2e80: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
2e90: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
2ea0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
2eb0: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
2ec0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
2ed0: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
2ee0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
2ef0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
2f00: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
2f10: 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74   above is ommitt
2f20: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
2f30: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
2f40: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
2f50: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
2f60: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
2f70: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
2f80: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
2f90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2fa0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
2fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fc0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
2fd0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
2fe0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2ff0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3000: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
3010: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
3020: 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20     int nPage;.  
3030: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3040: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
3050: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
3060: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
3070: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3080: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
3090: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
30a0: 65 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50  ecCreate((u32)nP
30b0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
30c0: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
30d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
30e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
30f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3100: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
3110: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
3120: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
3130: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
3140: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
3150: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
3160: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
3170: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
3180: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3190: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
31a0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
31b0: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
31c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
31d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
31e0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
31f0: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
3200: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
3210: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
3220: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
3230: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
3240: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
3250: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
3260: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
3270: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
3280: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
3290: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
32a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
32b0: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
32c0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
32d0: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
32e0: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
32f0: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
3300: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
3310: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
3320: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
3330: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
3340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
3350: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
3360: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3370: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
3380: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
3390: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
33a0: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
33b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
33c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
33d0: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
33e0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
33f0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
3400: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
3410: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
3420: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
3430: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
3440: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
3450: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
3460: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
3470: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
3480: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
3490: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
34a0: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
34b0: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
34c0: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
34d0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
34e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
34f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
3500: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3510: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
3520: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
3530: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
3540: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
3550: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
3560: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
3570: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
3580: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
3590: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
35a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
35b0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
35c0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
35d0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
35e0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
35f0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
3600: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
3610: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
3620: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
3630: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
3640: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
3650: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
3660: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
3670: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
3680: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
3690: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
36a0: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
36b0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
36c0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
36d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36e0: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61  && 0==pCur->apPa
36f0: 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a  ge[0]->intKey){.
3700: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
3710: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
3720: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
3730: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
3740: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
3750: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
3760: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
3770: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
3780: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
3790: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37a0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
37b0: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
37c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37d0: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
37e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
37f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
3800: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
3810: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
3820: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
3830: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
3840: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
3850: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3860: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3870: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
3880: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
3890: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
38a0: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
38b0: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
38c0: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
38d0: 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
38e0: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43  age = -1;.    pC
38f0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
3900: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
3910: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
3920: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3930: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
3940: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
3950: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
3960: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
3970: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
3980: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
3990: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
39a0: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
39b0: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
39c0: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
39d0: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
39e0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
39f0: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
3a00: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
3a10: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
3a20: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
3a30: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
3a40: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
3a50: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
3a60: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
3a70: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3a80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3a90: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3aa0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3ab0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
3ac0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
3ad0: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
3ae0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
3af0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3b00: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
3b10: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
3b20: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
3b30: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
3b40: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
3b50: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
3b60: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
3b70: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
3b80: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
3b90: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
3ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
3bb0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
3be0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
3bf0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
3c00: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
3c10: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
3c20: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
3c30: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
3c40: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
3c50: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3c60: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
3c70: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
3c80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
3c90: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
3ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
3cb0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
3cc0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
3cd0: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
3ce0: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
3cf0: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
3d00: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
3d10: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
3d20: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
3d30: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
3d40: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
3d50: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
3d60: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
3d70: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
3d80: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
3d90: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
3da0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3db0: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
3dc0: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
3dd0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
3de0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
3df0: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
3e00: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
3e10: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
3e20: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
3e30: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
3e40: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
3e50: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
3e60: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
3e70: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
3e80: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
3e90: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
3ea0: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
3eb0: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
3ec0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
3ed0: 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  LID;.  rc = sqli
3ee0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
3ef0: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
3f00: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
3f10: 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20  &pCur->skip);.  
3f20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3f30: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
3f40: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
3f50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
3f60: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
3f70: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
3f80: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
3f90: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
3fa0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
3fb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3fc0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
3fd0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3fe0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
3ff0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
4000: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
4010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
4020: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
4030: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
4040: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
4050: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
4060: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
4070: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
4080: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
4090: 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61  osition it.** wa
40a0: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74  s last placed at
40b0: 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  .  Cursors can m
40c0: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
40d0: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
40e0: 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65  ng.** at is dele
40f0: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
4100: 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er them..**.** T
4110: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4120: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rns an error cod
4130: 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  e if something g
4140: 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a  oes wrong.  The.
4150: 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73  ** integer *pHas
4160: 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
4170: 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  one if the curso
4180: 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20  r has moved and 
4190: 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74  0 if not..*/.int
41a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
41b0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
41c0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
41d0: 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69  *pHasMoved){.  i
41e0: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  nt rc;..  rc = r
41f0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
4200: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
4210: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61  ( rc ){.    *pHa
4220: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  sMoved = 1;.    
4230: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
4240: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
4250: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
4260: 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30  || pCur->skip!=0
4270: 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76   ){.    *pHasMov
4280: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
4290: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
42a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
42b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
42c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
42d0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
42e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
42f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
4300: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
4310: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
4320: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
4330: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
4340: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
4350: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
4360: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
4370: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f   page number..*/
4380: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
4390: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
43a0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
43b0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
43c0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
43d0: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
43e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
43f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4400: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4410: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
4420: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
4430: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
4440: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
4450: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
4460: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
4470: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
4480: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
4490: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
44a0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
44b0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
44c0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
44d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
44e0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
44f0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
4500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
4510: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
4520: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
4530: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
4540: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
4550: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
4560: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
4570: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
4580: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
4590: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
45a0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
45b0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
45c0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
45d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
45e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
45f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
4600: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
4610: 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20  rent){.  DbPage 
4620: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
4630: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
4640: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
4650: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
4660: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
4670: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
4680: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
4690: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
46a0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
46b0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
46c0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
46d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
46e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
46f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4700: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
4710: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
4720: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
4730: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
4740: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
4750: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
4760: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
4770: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
4780: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
4790: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
47a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
47b0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
47c0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
47d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
47e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
47f0: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
4800: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
4810: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
4820: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
4830: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
4840: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
4850: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4860: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
4870: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
4880: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
4890: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
48a0: 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  key);.  pPtrmap 
48b0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
48c0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
48d0: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
48e0: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
48f0: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
4900: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
4910: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
4920: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
4930: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
4940: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
4950: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
4960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4970: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
4980: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
4990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
49a0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
49b0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
49c0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
49d0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
49e0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
49f0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67   }..  sqlite3Pag
4a00: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
4a10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4a20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
4a30: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
4a40: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
4a50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
4a60: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
4a70: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
4a80: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
4a90: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
4aa0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
4ab0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
4ac0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
4ad0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
4ae0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
4af0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
4b00: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4b10: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
4b20: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
4b30: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
4b40: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b50: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
4b60: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
4b70: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
4b80: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
4b90: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
4ba0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
4bb0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
4bc0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
4bd0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
4be0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
4bf0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
4c00: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
4c10: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
4c20: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
4c30: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
4c40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4c50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4c60: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
4c70: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
4c80: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
4c90: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
4ca0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
4cb0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
4cc0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
4cd0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
4ce0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4cf0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
4d00: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
4d10: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
4d20: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
4d30: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
4d40: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
4d50: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  y);.  assert( pE
4d60: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
4d70: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
4d80: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
4d90: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
4da0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
4db0: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
4dc0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
4dd0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
4de0: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
4df0: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
4e00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
4e10: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
4e20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
4e30: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
4e40: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
4e50: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
4e60: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
4e70: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
4e80: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
4e90: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
4ea0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
4eb0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
4ec0: 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  l(y,z) SQLITE_OK
4ed0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
4ee0: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
4ef0: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
4f00: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
4f10: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
4f20: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
4f30: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
4f40: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
4f50: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
4f60: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
4f70: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
4f80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
4f90: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
4fa0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
4fb0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
4fc0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
4fd0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
4fe0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
4ff0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
5000: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
5010: 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c  ->aData[(P)->cel
5020: 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29  lOffset+2*(I)]))
5030: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  )../*.** This a 
5040: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
5050: 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c  sion of findCell
5060: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
5070: 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20  r.** pages that 
5080: 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  do contain overf
5090: 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20  low cells.  See 
50a0: 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63  insert.*/.static
50b0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
50c0: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
50d0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
50e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
50f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5100: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
5110: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5120: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
5130: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
5140: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
5150: 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66  .    struct _Ovf
5160: 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20  lCell *pOvfl;.  
5170: 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65    pOvfl = &pPage
5180: 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  ->aOvfl[i];.    
5190: 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a  k = pOvfl->idx;.
51a0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
51b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
51c0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
51d0: 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e    return pOvfl->
51e0: 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pCell;.      }. 
51f0: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
5200: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5210: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
5220: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
5230: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
5240: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
5250: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
5260: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
5270: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
5280: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
5290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73  his function.  s
52a0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
52b0: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
52c0: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
52d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
52e0: 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33  ment and sqlite3
52f0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
5300: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
5310: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
5320: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
5330: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
5340: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
5350: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
5360: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
5370: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
5380: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
5390: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
53a0: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
53b0: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
53c0: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
53d0: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64   faster..*/.void
53e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
53f0: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
5400: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
5410: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
5420: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
5430: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5450: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
5460: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
5470: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
5480: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
5490: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
54a0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
54d0: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
54e0: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
54f0: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
5500: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5510: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
5520: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
5530: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5540: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
5550: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
5560: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
5570: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
5580: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
5590: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
55a0: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
55b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
55c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
55d0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
55e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
55f0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
5600: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
5610: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
5620: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
5630: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
5640: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5650: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
5660: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
5670: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
5680: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
5690: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
56a0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
56b0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
56c0: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
56d0: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
56e0: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
56f0: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
5700: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
5710: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
5720: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
5730: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
5740: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
5750: 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  n;.  if( likely(
5760: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
5770: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
5780: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
5790: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
57a0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
57b0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
57c0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
57d0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
57e0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
57f0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
5800: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
5810: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
5820: 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  ze of cell conte
5830: 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  nt in bytes */. 
5840: 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c     nSize = nPayl
5850: 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  oad + n;.    pIn
5860: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
5870: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
5880: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
5890: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e   = 0;.    if( (n
58a0: 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b  Size & ~3)==0 ){
58b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
58c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
58d0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
58e0: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
58f0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
5900: 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  u16)nSize;.  }el
5910: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
5920: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
5930: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
5940: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
5950: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
5960: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
5970: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
5980: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
5990: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
59a0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
59b0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
59c0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
59d0: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
59e0: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
59f0: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
5a00: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
5a10: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
5a20: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
5a30: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
5a40: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
5a50: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
5a60: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
5a70: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
5a80: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
5a90: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
5aa0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
5ab0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
5ac0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
5ad0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
5ae0: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
5af0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
5b00: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
5b10: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5b20: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5b30: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
5b40: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
5b50: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5b60: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5b70: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
5b80: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
5b90: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
5ba0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
5bb0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
5bc0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
5bd0: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
5be0: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
5bf0: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
5c00: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
5c10: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
5c20: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
5c30: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
5c40: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
5c50: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
5c60: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
5c70: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
5c80: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
5c90: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
5ca0: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
5cb0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
5cc0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
5cd0: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
5ce0: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
5cf0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
5d00: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
5d10: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
5d20: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
5d30: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
5d40: 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  \.  sqlite3Btree
5d50: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50  ParseCellPtr((pP
5d60: 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28  age), findCell((
5d70: 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29  pPage), (iCell))
5d80: 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20  , (pInfo)).void 
5d90: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
5da0: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
5db0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
5dc0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
5dd0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
5de0: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
5df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5e00: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
5e10: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
5e20: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
5e30: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
5e40: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
5e50: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72  ture */.){.  par
5e60: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
5e70: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ell, pInfo);.}..
5e80: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
5e90: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
5ea0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
5eb0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
5ec0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
5ed0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
5ee0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
5ef0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
5f00: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
5f10: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
5f20: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
5f30: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
5f40: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
5f50: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
5f60: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
5f70: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
5f80: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
5f90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
5fa0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
5fb0: 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b  *pIter = &pCell[
5fc0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
5fd0: 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a  ize];.  u32 nSiz
5fe0: 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
5ff0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
6000: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
6010: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
6020: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
6030: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
6040: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
6050: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
6060: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
6070: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
6080: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
6090: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
60a0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
60b0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
60c0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
60d0: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
60e0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
60f0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
6100: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
6110: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
6120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
6130: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
6140: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
6150: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
6160: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
6170: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
6180: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
6190: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
61a0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
61b0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
61c0: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
61d0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
61e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
61f0: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
6200: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
6210: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
6220: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
6230: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
6240: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
6250: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
6260: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
6270: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
6280: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
6290: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
62a0: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
62b0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
62c0: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
62d0: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
62e0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
62f0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
6300: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
6310: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
6320: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
6330: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
6340: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
6350: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
6360: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
6370: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
6380: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
6390: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
63a0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
63b0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
63c0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
63d0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
63e0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
63f0: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
6400: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 70 49 74  .  nSize += (pIt
6410: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20  er - pCell);..  
6420: 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  /* The minimum s
6430: 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20  ize of any cell 
6440: 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  is 4 bytes. */. 
6450: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a   if( nSize<4 ){.
6460: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20      nSize = 4;. 
6470: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53   }..  assert( nS
6480: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
6490: 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e  Size );.  return
64a0: 20 6e 53 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65   nSize;.}.#ifnde
64b0: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
64c0: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
64d0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
64e0: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
64f0: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  n cellSizePtr(pP
6500: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
6510: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
6520: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6540: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
6550: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
6560: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
6570: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
6580: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
6590: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
65a0: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
65b0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
65c0: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
65d0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
65e0: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
65f0: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
6600: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
6610: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
6620: 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72  fo info;.  asser
6630: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
6640: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
6650: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
6660: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
6670: 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
6680: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
6690: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
66a0: 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
66b0: 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e 66 6f  d );.  if( (info
66c0: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
66d0: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
66e0: 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
66f0: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
6700: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
6710: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
6720: 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  w]);.    return 
6730: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
6740: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
6750: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
6760: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
6770: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6780: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
6790: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
67a0: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
67b0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
67c0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
67d0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
67e0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
67f0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6800: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
6810: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
6820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6830: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
6840: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6850: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
6860: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
6870: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6880: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
6890: 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c  utex) );.  pCell
68a0: 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
68b0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
68c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d  );.  return ptrm
68d0: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
68e0: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65  ge, pCell);.}.#e
68f0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
6900: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
6910: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
6920: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
6930: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
6940: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
6950: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
6960: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
6970: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
6980: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
6990: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
69a0: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
69b0: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
69c0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
69d0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
69e0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
69f0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
6a00: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a20: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
6a30: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
6a60: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
6a70: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
6a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
6a90: 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62 79  fset of first by
6aa0: 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f  te after cell po
6ab0: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
6ac0: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6ae0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
6af0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
6b00: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
6b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
6b20: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
6b30: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
6b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6b50: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
6b60: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
6b70: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
6b80: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
6b90: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
6ba0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
6bb0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
6bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6bd0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
6be0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6bf0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
6c00: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
6c10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6c20: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
6c30: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
6c40: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
6c50: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
6c60: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
6c70: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
6c80: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
6c90: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
6ca0: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
6cb0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
6cc0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
6cd0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
6ce0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
6cf0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
6d00: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
6d10: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
6d20: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
6d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6d40: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
6d50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
6d60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6d70: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6d80: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
6d90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
6da0: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
6db0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
6dc0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
6dd0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
6de0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
6df0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
6e00: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
6e10: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
6e20: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
6e30: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
6e40: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
6e50: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
6e60: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
6e70: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
6e80: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6e90: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
6ea0: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
6eb0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
6ec0: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
6ed0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
6ee0: 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Size;.  for(i=0;
6ef0: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
6f00: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
6f10: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
6f20: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
6f30: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
6f40: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
6f50: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
6f60: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
6f70: 20 20 69 66 28 20 70 63 3e 3d 75 73 61 62 6c 65    if( pc>=usable
6f80: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
6f90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6fa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
6fb0: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
6fc0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
6fd0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
6fe0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
6ff0: 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c 4f 66 66  if( cbrk<cellOff
7000: 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c 7c 20 70  set+2*nCell || p
7010: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
7020: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
7030: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7040: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
7050: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
7060: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
7070: 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a 20 20 20  & cbrk>=0 );.   
7080: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
7090: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
70a0: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
70b0: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
70c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
70d0: 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74  cbrk>=cellOffset
70e0: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
70f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7100: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
7110: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
7120: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
7130: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
7140: 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65  = 0;.  addr = ce
7150: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
7160: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
7170: 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62 72 6b 2d  [addr], 0, cbrk-
7180: 61 64 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  addr);.  assert(
7190: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
71a0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
71b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
71c0: 28 20 63 62 72 6b 2d 61 64 64 72 21 3d 70 50 61  ( cbrk-addr!=pPa
71d0: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
71e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
71f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
7200: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7210: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
7220: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
7230: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
7240: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
7250: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
7260: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
7270: 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
7280: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
7290: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66  Page->aData[] of
72a0: 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 62   the .** first b
72b0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
72c0: 20 73 70 61 63 65 2e 20 0a 2a 2a 0a 2a 2a 20 54   space. .**.** T
72d0: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
72e0: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 73 70  tees that the sp
72f0: 61 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  ace between the 
7300: 65 6e 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  end of the cell-
7310: 6f 66 66 73 65 74 20 0a 2a 2a 20 61 72 72 61 79  offset .** array
7320: 20 61 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f   and the start o
7330: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
7340: 6e 74 20 61 72 65 61 20 69 73 20 61 74 20 6c 65  nt area is at le
7350: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 0a  ast nByte bytes.
7360: 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 53 6f 20 74  ** in size. So t
7370: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
7380: 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  never fail..**.*
7390: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
73a0: 6c 72 65 61 64 79 20 36 30 20 6f 72 20 6d 6f 72  lready 60 or mor
73b0: 65 20 62 79 74 65 73 20 6f 66 20 66 72 61 67 6d  e bytes of fragm
73c0: 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65 20  ents within the 
73d0: 70 61 67 65 2c 0a 2a 2a 20 74 68 65 20 70 61 67  page,.** the pag
73e0: 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65  e is defragmente
73f0: 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
7400: 6e 67 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  ng. If this were
7410: 20 6e 6f 74 20 64 6f 6e 65 20 74 68 65 72 65 0a   not done there.
7420: 2a 2a 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  ** is a chance t
7430: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
7440: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
7450: 65 73 20 63 6f 75 6c 64 20 65 76 65 6e 74 75 61  es could eventua
7460: 6c 6c 79 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  lly .** overflow
7470: 20 74 68 65 20 73 69 6e 67 6c 65 2d 62 79 74 65   the single-byte
7480: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
7490: 67 65 2d 68 65 61 64 65 72 20 69 6e 20 77 68 69  ge-header in whi
74a0: 63 68 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  ch this value.**
74b0: 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 73   is stored..*/.s
74c0: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
74d0: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
74e0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
74f0: 65 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  e){.  const int 
7500: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
7510: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
7520: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
7530: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
7540: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
7550: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7560: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
7570: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
7580: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
7590: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
75c0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
75d0: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
75e0: 20 74 6f 70 3b 0a 20 20 0a 20 20 61 73 73 65 72   top;.  .  asser
75f0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
7600: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
7610: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
7620: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
7630: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
7640: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7650: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
7660: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
7670: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
7680: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
7690: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
76a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
76b0: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
76c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
76d0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
76e0: 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
76f0: 20 74 68 65 20 73 70 61 63 65 20 62 65 74 77 65   the space betwe
7700: 65 6e 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73  en the cell-offs
7710: 65 74 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  et array and the
7720: 20 0a 20 20 2a 2a 20 63 65 6c 6c 2d 63 6f 6e 74   .  ** cell-cont
7730: 65 6e 74 20 61 72 65 61 20 69 73 20 67 72 65 61  ent area is grea
7740: 74 65 72 20 74 68 61 6e 20 6e 42 79 74 65 20 62  ter than nByte b
7750: 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ytes..  */.  ass
7760: 65 72 74 28 20 6e 42 79 74 65 20 3c 3d 20 28 0a  ert( nByte <= (.
7770: 20 20 20 20 20 20 67 65 74 32 62 79 74 65 28 26        get2byte(&
7780: 64 61 74 61 5b 68 64 72 2b 35 5d 29 2d 28 68 64  data[hdr+5])-(hd
7790: 72 2b 38 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66  r+8+(pPage->leaf
77a0: 3f 30 3a 34 29 2b 32 2a 67 65 74 32 62 79 74 65  ?0:4)+2*get2byte
77b0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 29 0a  (&data[hdr+3])).
77c0: 20 20 29 29 3b 0a 0a 20 20 70 50 61 67 65 2d 3e    ));..  pPage->
77d0: 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 6e 42  nFree -= (u16)nB
77e0: 79 74 65 3b 0a 20 20 6e 46 72 61 67 20 3d 20 64  yte;.  nFrag = d
77f0: 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66  ata[hdr+7];.  if
7800: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
7810: 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67     defragmentPag
7820: 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
7830: 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
7840: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
7850: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
7860: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
7870: 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20   to satisfy .   
7880: 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e   ** the request.
7890: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
78a0: 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65  is made from the
78b0: 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74   first free slot
78c0: 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
78d0: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72  list that is lar
78e0: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63  ge enough to acc
78f0: 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20  omadate it..    
7900: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  */.    int pc, a
7910: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
7920: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
7930: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
7940: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
7950: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
7960: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
7970: 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f  ta[pc+2]);     /
7980: 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73  * Size of free s
7990: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
79a0: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
79b0: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
79c0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
79d0: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
79e0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
79f0: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
7a00: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
7a10: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
7a20: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
7a30: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
7a40: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
7a50: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
7a60: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
7a70: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
7a80: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
7a90: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
7aa0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
7ab0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
7ad0: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
7ae0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
7af0: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
7b00: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
7b10: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
7b20: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
7b30: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
7b40: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
7b50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
7b60: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
7b70: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
7b80: 6e 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20  n pc + x;.      
7b90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
7ba0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
7bb0: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
7bc0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
7bd0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
7be0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
7bf0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
7c00: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  .  */.  top = ge
7c10: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7c20: 2b 35 5d 29 20 2d 20 6e 42 79 74 65 3b 0a 20 20  +5]) - nByte;.  
7c30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
7c40: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
7c50: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
7c60: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
7c70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
7c80: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
7c90: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
7ca0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
7cb0: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
7cc0: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
7cd0: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
7ce0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
7cf0: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
7d00: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
7d10: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
7d20: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
7d30: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
7d40: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
7d50: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
7d60: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
7d70: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
7d80: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
7d90: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
7da0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
7db0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
7dc0: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73  egin, hdr;.  uns
7dd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7de0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
7df0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
7e00: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
7e10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7e20: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
7e30: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
7e40: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
7e50: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
7e60: 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
7e70: 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73  af?0:4) );.  ass
7e80: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
7e90: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
7ea0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
7eb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7ec0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
7ed0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
7ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
7ef0: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
7f00: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
7f10: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
7f20: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
7f30: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
7f40: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
7f50: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
7f60: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
7f70: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
7f80: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
7f90: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7fa0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
7fb0: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
7fc0: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
7fd0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
7fe0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
7ff0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
8000: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20  blocks */.  hdr 
8010: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
8020: 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72  et;.  addr = hdr
8030: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
8040: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
8050: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c  e(&data[addr]))<
8060: 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e  start && pbegin>
8070: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
8080: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
8090: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
80a0: 34 20 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  4 );.    if( pbe
80b0: 67 69 6e 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20  gin<=addr ) {.  
80c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
80d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
80e0: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d      }.    addr =
80f0: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69   pbegin;.  }.  i
8100: 66 20 28 20 70 62 65 67 69 6e 3e 70 50 61 67 65  f ( pbegin>pPage
8110: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8120: 65 2d 34 20 29 20 7b 0a 20 20 20 20 72 65 74 75  e-4 ) {.    retu
8130: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8140: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
8150: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
8160: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
8170: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
8180: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
8190: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
81a0: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
81b0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
81c0: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
81d0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
81e0: 46 72 65 65 20 2b 3d 20 28 75 31 36 29 73 69 7a  Free += (u16)siz
81f0: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
8200: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
8210: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
8220: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
8230: 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  set + 1;.  while
8240: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
8250: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
8260: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
8270: 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b  pnext, psize, x;
8280: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
8290: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
82a0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
82b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
82c0: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
82d0: 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65  pnext = get2byte
82e0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b  (&data[pbegin]);
82f0: 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74  .    psize = get
8300: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
8310: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  in+2]);.    if( 
8320: 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b  pbegin + psize +
8330: 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70   3 >= pnext && p
8340: 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
8350: 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74  int frag = pnext
8360: 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65   - (pbegin+psize
8370: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72  );.      if( (fr
8380: 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28  ag<0) || (frag>(
8390: 69 6e 74 29 64 61 74 61 5b 70 50 61 67 65 2d 3e  int)data[pPage->
83a0: 68 64 72 4f 66 66 73 65 74 2b 37 5d 29 20 29 7b  hdrOffset+7]) ){
83b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
83c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
83d0: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
83e0: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
83f0: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 28  drOffset+7] -= (
8400: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
8410: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8420: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
8430: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
8440: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
8450: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
8460: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
8470: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
8480: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
8490: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
84a0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
84b0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
84c0: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
84d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
84e0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
84f0: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
8500: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
8510: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
8520: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
8530: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
8540: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
8550: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
8560: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
8570: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8580: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
8590: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
85a0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
85b0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
85c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
85d0: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
85e0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
85f0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
8600: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
8610: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
8620: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
8630: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
8640: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
8650: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8660: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
8670: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
8680: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
8690: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
86a0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
86b0: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
86c0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
86d0: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
86e0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
86f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
8700: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
8710: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
8720: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
8730: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
8740: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
8750: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
8760: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
8770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
8780: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
8790: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
87a0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
87b0: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
87c0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
87d0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
87e0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
87f0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
8800: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
8810: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
8820: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
8830: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
8840: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
8850: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
8860: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
8870: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
8880: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
8890: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
88a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
88b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
88c0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
88d0: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
88e0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
88f0: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
8900: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
8910: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
8920: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
8930: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
8940: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
8950: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
8960: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
8970: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
8980: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
8990: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
89a0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
89b0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
89c0: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
89d0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
89e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
89f0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
8a00: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
8a10: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
8a20: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
8a30: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
8a40: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
8a50: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
8a60: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
8a70: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
8a80: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
8a90: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
8aa0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
8ab0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8ac0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8ad0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8ae0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
8af0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
8b00: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
8b10: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
8b20: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
8b30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
8b40: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
8b50: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
8b60: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
8b70: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
8b80: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
8b90: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
8ba0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
8bb0: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
8bc0: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
8bd0: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
8be0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
8bf0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
8c00: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
8c10: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
8c20: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
8c30: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
8c40: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
8c50: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d  3BtreeInitPage(M
8c60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
8c70: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8c80: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
8c90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8ca0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8cb0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8cc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8cd0: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
8ce0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
8cf0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
8d00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
8d10: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
8d20: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(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 2d 3e 61 44 61 74  ert( pPage->aDat
8d50: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
8d60: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
8d70: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
8d80: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
8d90: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8db0: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
8dc0: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
8dd0: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
8de0: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
8df0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8e00: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
8e10: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8e20: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
8e30: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
8e40: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
8e50: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
8e60: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
8e70: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
8e80: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75  ructure */.    u
8e90: 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  16 usableSize;  
8ea0: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
8eb0: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
8ec0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
8ed0: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
8ee0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
8ef0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
8f00: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
8f10: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  inter */.    u16
8f20: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
8f30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
8f40: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
8f50: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
8f60: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
8f70: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
8f80: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
8f90: 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70  t area */..    p
8fa0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
8fb0: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
8fc0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
8fd0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
8fe0: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
8ff0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
9000: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
9010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9020: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
9030: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
9040: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
9050: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36  ->pageSize<=3276
9060: 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  8 );.    pPage->
9070: 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e  maskPage = pBt->
9080: 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20  pageSize - 1;.  
9090: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
90a0: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
90b0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
90c0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
90d0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
90e0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
90f0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
9100: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70  e->leaf;.    top
9110: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9120: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
9130: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
9140: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9150: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
9160: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
9170: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
9180: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
9190: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
91a0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
91b0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
91c0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
91d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
91e0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  PT;.    }.  .   
91f0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
9200: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
9210: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
9220: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
9230: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
9240: 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74  .    nFree = dat
9250: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d  a[hdr+7] + top -
9260: 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32   (cellOffset + 2
9270: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a  *pPage->nCell);.
9280: 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20      while( pc>0 
9290: 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78  ){.      u16 nex
92a0: 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  t, size;.      i
92b0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
92c0: 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -4 ){.        /*
92d0: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
92e0: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
92f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9300: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9310: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
9320: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
9330: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
9340: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
9350: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
9360: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
9370: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
9380: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20  ize+3 ){.       
9390: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
93a0: 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e  must be in accen
93b0: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
93c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
93d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
93e0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
93f0: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
9400: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
9410: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
9420: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 6e  ->nFree = (u16)n
9430: 46 72 65 65 3b 0a 20 20 20 20 69 66 28 20 6e 46  Free;.    if( nF
9440: 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  ree>=usableSize 
9450: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
9460: 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78   space cannot ex
9470: 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20  ceed total page 
9480: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  size */.      re
9490: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
94a0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
94b0: 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65  ..#if 0.  /* Che
94c0: 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20  ck that all the 
94d0: 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65 20 63  offsets in the c
94e0: 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79  ell offset array
94f0: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
9500: 65 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  e. .  ** .  ** O
9510: 6d 69 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e  mitting this con
9520: 73 69 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61  sistency check a
9530: 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70 50 61  nd using the pPa
9540: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73  ge->maskPage mas
9550: 6b 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e  k.  ** to preven
9560: 74 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68  t overrunning th
9570: 65 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e  e page buffer in
9580: 20 66 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75   findCell() resu
9590: 6c 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e  lts in a.  ** 2.
95a0: 35 25 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67  5% performance g
95b0: 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ain..  */.  {.  
95c0: 20 20 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20    u8 *pOff;     
95d0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75     /* Iterator u
95e0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c  sed to check all
95f0: 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72   cell offsets ar
9600: 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20  e in range */.  
9610: 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20    u8 *pEnd;     
9620: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
9630: 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66   end of cell off
9640: 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  set array */.   
9650: 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20   u8 mask;       
9660: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
9670: 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a  s that must be z
9680: 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65  ero in MSB of ce
9690: 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20  ll offsets */.  
96a0: 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29    mask = ~(((u8)
96b0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
96c0: 38 29 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64  8))-1);.    pEnd
96d0: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
96e0: 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65  set + pPage->nCe
96f0: 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70  ll*2];.    for(p
9700: 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66  Off=&data[cellOf
9710: 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e  fset]; pOff!=pEn
9720: 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d  d && !((*pOff)&m
9730: 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a  ask); pOff+=2);.
9740: 20 20 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45      if( pOff!=pE
9750: 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  nd ){.      retu
9760: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9770: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
9780: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 50  }.#endif..    pP
9790: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
97a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
97b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
97c0: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
97d0: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
97e0: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
97f0: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
9800: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
9810: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9820: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
9830: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
9840: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
9850: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
9860: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
9870: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
9880: 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
9890: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
98a0: 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
98b0: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
98c0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
98d0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
98e0: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
98f0: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
9900: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
9910: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
9920: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
9930: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
9940: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
9950: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
9960: 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
9970: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9980: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9990: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
99a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
99b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
99c0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
99d0: 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74  .  /*memset(&dat
99e0: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
99f0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
9a00: 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d  );*/.  data[hdr]
9a10: 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a   = (char)flags;.
9a20: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
9a30: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
9a40: 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29  F_LEAF)==0 ?1:0)
9a50: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
9a60: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
9a70: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
9a80: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
9a90: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
9aa0: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
9ab0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
9ac0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
9ad0: 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65   first;.  decode
9ae0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
9af0: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
9b00: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
9b10: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9b20: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
9b30: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
9b40: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
9b50: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
9b60: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
9b70: 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50  e<=32768 );.  pP
9b80: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
9b90: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
9ba0: 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  1;.  pPage->nCel
9bb0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
9bc0: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
9bd0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
9be0: 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
9bf0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
9c00: 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
9c10: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
9c20: 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
9c30: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
9c40: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
9c50: 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
9c60: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
9c70: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
9c80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
9c90: 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
9ca0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
9cb0: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
9cc0: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
9cd0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
9ce0: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
9cf0: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
9d00: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
9d10: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
9d20: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
9d30: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9d40: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
9d50: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72  1 ? 100 : 0;.  r
9d60: 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
9d70: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
9d80: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
9d90: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
9da0: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
9db0: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
9dc0: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
9dd0: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eeded..**.** If 
9de0: 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
9df0: 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
9e00: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
9e10: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a  ot care about.**
9e20: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
9e30: 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
9e40: 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
9e50: 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
9e60: 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
9e70: 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
9e80: 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
9e90: 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
9ea0: 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
9eb0: 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
9ec0: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
9ed0: 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
9ee0: 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
9ef0: 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
9f00: 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
9f10: 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
9f20: 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
9f30: 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
9f40: 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
9f50: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
9f60: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a 20  3BtreeGetPage(. 
9f70: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
9f80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
9f90: 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
9fa0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
9fb0: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
9fc0: 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
9fd0: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
9fe0: 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
9ff0: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
a000: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
a010: 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
a020: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c       /* Do not l
a030: 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
a040: 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
a050: 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
a060: 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
a070: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a080: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
a090: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
a0a0: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
a0b0: 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
a0c0: 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
a0d0: 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e  )&pDbPage, noCon
a0e0: 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20  tent);.  if( rc 
a0f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
a100: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
a110: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
a120: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
a130: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a140: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
a150: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
a160: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
a170: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
a180: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
a190: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
a1a0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
a1b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
a1c0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
a1d0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
a1e0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
a1f0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
a200: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
a210: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
a220: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
a230: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
a240: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
a250: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a260: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a270: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a280: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
a290: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
a2a0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
a2b0: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
a2c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
a2d0: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
a2e0: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
a2f0: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
a300: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
a310: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
a320: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
a330: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
a340: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
a350: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
a360: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
a370: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
a380: 61 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50  atic Pgno pagerP
a390: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
a3a0: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e  d *pBt){.  int n
a3b0: 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  Page = -1;.  int
a3c0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
a3d0: 42 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20  Bt->pPage1 );.  
a3e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a3f0: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
a400: 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
a410: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
a420: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67  QLITE_OK || nPag
a430: 65 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72  e==-1 );.  retur
a440: 6e 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d  n (Pgno)nPage;.}
a450: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
a460: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
a470: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
a480: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
a490: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
a4a0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
a4b0: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
a4c0: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
a4d0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
a4e0: 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  age() and sqlite
a4f0: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
a500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a510: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
a520: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
a530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a540: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
a550: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
a560: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a570: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
a580: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
a590: 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  ge **ppPage     
a5a0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
a5b0: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
a5c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
a5d0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
a5e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
a5f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a600: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a610: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
a620: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a630: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
a640: 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
a650: 6f 66 74 65 6e 20 74 68 65 20 63 61 73 65 20 74  often the case t
a660: 68 61 74 20 74 68 65 20 70 61 67 65 20 77 65 20  hat the page we 
a670: 77 61 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20  want is already 
a680: 69 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49  in cache..  ** I
a690: 66 20 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72  f so, get it dir
a6a0: 65 63 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76  ectly.  This sav
a6b0: 65 73 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e  es us from havin
a6c0: 67 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70  g to call.  ** p
a6d0: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20  agerPagecount() 
a6e0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e  to make sure pgn
a6f0: 6f 20 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69  o is within limi
a700: 74 73 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74  ts, which result
a710: 73 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73  s.  ** in a meas
a720: 75 72 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61  ureable performa
a730: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73  nce improvements
a740: 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ..  */.  *ppPage
a750: 20 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65   = pPage = btree
a760: 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
a770: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
a780: 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67  ge ){.    /* Pag
a790: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
a7a0: 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 72 63 20  cache */.    rc 
a7b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
a7c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67  else{.    /* Pag
a7d0: 65 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  e not in cache. 
a7e0: 20 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a   Acquire it. */.
a7f0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67      if( pgno>pag
a800: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
a810: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
a820: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a830: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
a840: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
a850: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
a860: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
a870: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
a880: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
a890: 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  ge = *ppPage;.  
a8a0: 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
a8b0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  isInit ){.    rc
a8c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
a8d0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
a8e0: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
a8f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
a900: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
a910: 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  );.    *ppPage =
a920: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
a930: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
a940: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
a950: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
a960: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
a970: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
a980: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
a990: 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
a9a0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
a9b0: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
a9c0: 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
a9d0: 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  age ){.    asser
a9e0: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
a9f0: 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  low==0 || sqlite
aa00: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
aa10: 6e 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  nt(pPage->pDbPag
aa20: 65 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65  e)>1 );.    asse
aa30: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
aa40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
aa50: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
aa60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
aa70: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
aa80: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
aa90: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
aaa0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
aab0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
aac0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
aad0: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
aae0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
aaf0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ab00: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
ab10: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
ab20: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
ab30: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
ab40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69   }.}../*.** Duri
ab50: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
ab60: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
ab70: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
ab80: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
ab90: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
aba0: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
abb0: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
abc0: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
abd0: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
abe0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
abf0: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
ac00: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
ac10: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
ac20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
ac30: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
ac40: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
ac50: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
ac60: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
ac70: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
ac80: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
ac90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
aca0: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
acb0: 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
acc0: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
acd0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
ace0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
acf0: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
ad00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ad10: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
ad20: 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
ad30: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
ad40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
ad50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ad60: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
ad70: 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
ad80: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
ad90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
ada0: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
adb0: 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
adc0: 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
add0: 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
ade0: 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
adf0: 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
ae00: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
ae10: 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
ae20: 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
ae30: 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
ae40: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
ae50: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
ae60: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
ae70: 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
ae80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ae90: 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
aea0: 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
aeb0: 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
aec0: 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
aed0: 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
aee0: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
aef0: 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
af00: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
af10: 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
af20: 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
af30: 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
af40: 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
af50: 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
af60: 67 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  g. */.      sqli
af70: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
af80: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
af90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
afa0: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
afb0: 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
afc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
afd0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
afe0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
aff0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
b000: 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
b010: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
b020: 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
b030: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b040: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
b050: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
b060: 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
b070: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
b080: 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
b090: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
b0a0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
b0b0: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
b0c0: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
b0d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
b0e0: 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
b0f0: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
b100: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77  a new database w
b110: 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d  ith a random nam
b120: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
b130: 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d  his randomly nam
b140: 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  ed.** database f
b150: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
b160: 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33  ted when sqlite3
b170: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
b180: 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46  called..** If zF
b190: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
b1a0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
b1b0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
b1c0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
b1d0: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
b1e0: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
b1f0: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
b200: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
b210: 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
b220: 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
b230: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
b240: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
b250: 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
b260: 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
b270: 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
b280: 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
b290: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b2a0: 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
b2b0: 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
b2c0: 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
b2d0: 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
b2e0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
b2f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
b300: 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
b310: 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
b320: 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
b330: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
b340: 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73  treeOpen(.  cons
b350: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
b360: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
b370: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
b380: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
b390: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
b3a0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
b3b0: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
b3c0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
b3d0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
b3e0: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
b3f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
b400: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
b410: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
b420: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
b430: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
b440: 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
b450: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
b460: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
b470: 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
b480: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
b490: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
b4a0: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
b4b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
b4c0: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
b4d0: 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61  btree */.  BtSha
b4e0: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
b4f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
b500: 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
b510: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
b520: 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
b550: 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
b560: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
b570: 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
b580: 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
b590: 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
b5a0: 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
b5b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
b5c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
b5d0: 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
b5e0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
b5f0: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b610: 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
b620: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
b630: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
b640: 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
b650: 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
b660: 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
b670: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   */..  /* Set th
b680: 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
b690: 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
b6a0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
b6b0: 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
b6c0: 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
b6d0: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20  based database. 
b6e0: 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f  This symbol is o
b6f0: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a  nly required if.
b700: 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74    ** either of t
b710: 68 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f  he shared-data o
b720: 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61  r autovacuum fea
b730: 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c  tures are compil
b740: 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  ed .  ** into th
b750: 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a  e library..  */.
b760: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
b770: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
b780: 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e  CACHE) || !defin
b790: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
b7a0: 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66  UTOVACUUM).  #if
b7b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b7c0: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e  MEMORYDB.    con
b7d0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
b7e0: 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20   0;.  #else.    
b7f0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
b800: 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  b = zFilename &&
b810: 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61   !strcmp(zFilena
b820: 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b  me, ":memory:");
b830: 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  .  #endif.#endif
b840: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
b850: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
b860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b870: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
b880: 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  .  pVfs = db->pV
b890: 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  fs;.  p = sqlite
b8a0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
b8b0: 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
b8c0: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
b8d0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
b8e0: 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
b8f0: 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
b900: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23    p->db = db;..#
b910: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b920: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
b930: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
b940: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
b950: 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
b960: 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
b970: 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
b980: 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
b990: 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
b9a0: 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
b9b0: 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
b9c0: 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
b9d0: 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
b9e0: 4d 65 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c  Memdb==0 && zFil
b9f0: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
ba00: 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28  me[0] ){.    if(
ba10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
ba20: 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
ba30: 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20  Enabled ){.     
ba40: 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
ba50: 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
ba60: 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
ba70: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
ba80: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
ba90: 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  oc(nFullPathname
baa0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bab0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
bac0: 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  red;.      p->sh
bad0: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
bae0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
baf0: 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63 68  QLITE_SharedCach
bb00: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  e;.      if( !zF
bb10: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
bb20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
bb30: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
bb40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bb50: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
bb60: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c     sqlite3OsFull
bb70: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
bb80: 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50  Filename, nFullP
bb90: 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
bba0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d  thname);.      m
bbb0: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
bbc0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
bbd0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
bbe0: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
bbf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
bc00: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
bc10: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
bc20: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
bc30: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
bc40: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
bc50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
bc60: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
bc70: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
bc80: 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
bc90: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
bca0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
bcb0: 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
bcc0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
bcd0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
bce0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
bcf0: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
bd00: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
bd10: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
bd20: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20  pBt->pPager)).  
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
bd40: 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
bd50: 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
bd60: 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
bd70: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
bd80: 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
bd90: 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
bda0: 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
bdb0: 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
bdc0: 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
bdd0: 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
bde0: 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
bdf0: 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
be00: 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
be10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
be20: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
be30: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
be40: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
be50: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
be60: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
be70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
be80: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
be90: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
bea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
beb0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
bec0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bed0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
bee0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
bef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
bf00: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
bf10: 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
bf20: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
bf30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
bf40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
bf50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
bf60: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
bf70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
bf80: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
bf90: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
bfa0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
bfb0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
bfc0: 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
bfd0: 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
bfe0: 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
bff0: 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
c000: 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
c010: 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
c020: 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
c030: 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
c040: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
c050: 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
c060: 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
c070: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c080: 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
c090: 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
c0a0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
c0b0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
c0c0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
c0d0: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
c0e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
c0f0: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
c100: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
c110: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
c120: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
c130: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
c140: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
c150: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
c160: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
c170: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
c180: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
c190: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
c1a0: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
c1b0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
c1c0: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
c1d0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
c1e0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
c1f0: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
c200: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
c210: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
c220: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
c230: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
c240: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
c250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
c260: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
c270: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
c280: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
c290: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
c2a0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
c2b0: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
c2c0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
c2d0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c2e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
c2f0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
c300: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
c310: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
c320: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
c330: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
c340: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
c360: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
c370: 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  vfsFlags);.    i
c380: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c390: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
c3a0: 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
c3b0: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
c3c0: 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
c3d0: 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
c3e0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
c3f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c400: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
c410: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
c420: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20    }.    pBt->db 
c430: 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
c440: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
c450: 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
c460: 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
c470: 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
c480: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
c490: 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  ;.  .    sqlite3
c4a0: 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
c4b0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61  (pBt->pPager, pa
c4c0: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70  geReinit);.    p
c4d0: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
c4e0: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
c4f0: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72   = 0;.    pBt->r
c500: 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65  eadOnly = sqlite
c510: 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
c520: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
c530: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
c540: 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62   = get2byte(&zDb
c550: 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20  Header[16]);.   
c560: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
c570: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
c580: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
c590: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
c5a0: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
c5b0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
c5c0: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
c5d0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
c5e0: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
c5f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c600: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
c610: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
c620: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
c630: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
c640: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
c650: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
c660: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
c670: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
c680: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
c690: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
c6a0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
c6b0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
c6c0: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
c6d0: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
c6e0: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
c6f0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
c700: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
c710: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
c720: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
c730: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
c740: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
c750: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
c760: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
c770: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
c780: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
c790: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
c7a0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
c7b0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
c7c0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
c7d0: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
c7e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
c7f0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
c800: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
c810: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
c820: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
c830: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
c840: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
c850: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
c860: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
c870: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  0];.      pBt->p
c880: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
c890: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
c8a0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
c8b0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
c8c0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
c8d0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
c8e0: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
c8f0: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
c900: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
c910: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
c920: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
c930: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
c940: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
c950: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
c960: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
c970: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
c980: 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
c990: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
c9a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
c9b0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
c9c0: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
c9d0: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
c9e0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
c9f0: 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
ca00: 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
ca10: 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
ca20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ca30: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
ca40: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ca50: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
ca60: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
ca70: 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
ca80: 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
ca90: 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
caa0: 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
cab0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
cac0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
cad0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
cae0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
caf0: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
cb00: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
cb10: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
cb20: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
cb30: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
cb40: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
cb50: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
cb60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
cb70: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
cb80: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
cb90: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
cba0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
cbb0: 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
cbc0: 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
cbd0: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
cbe0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
cbf0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
cc00: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
cc10: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
cc20: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
cc30: 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
cc40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
cc50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
cc60: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
cc70: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
cc80: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
cc90: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
cca0: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
ccb0: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
ccc0: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
ccd0: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
cce0: 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
ccf0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
cd00: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
cd10: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
cd20: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
cd30: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
cd40: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
cd50: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
cd60: 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
cd70: 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
cd80: 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
cd90: 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
cda0: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
cdb0: 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
cdc0: 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
cdd0: 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
cde0: 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
cdf0: 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
ce00: 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
ce10: 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
ce20: 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
ce30: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
ce40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ce50: 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
ce60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
ce70: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
ce80: 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
ce90: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
cea0: 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
ceb0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
cec0: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
ced0: 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
cee0: 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
cef0: 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
cf00: 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
cf10: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
cf20: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
cf30: 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
cf40: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
cf50: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
cf60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cf70: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
cf80: 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
cf90: 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
cfa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
cfb0: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
cfc0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
cfd0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
cfe0: 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
cff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
d000: 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
d010: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
d020: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
d030: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
d040: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
d050: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
d060: 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
d070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d090: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
d0a0: 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
d0b0: 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
d0c0: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
d0d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
d0e0: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
d0f0: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
d100: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
d110: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
d120: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
d130: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
d140: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
d150: 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
d160: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
d170: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
d180: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d190: 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
d1a0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
d1b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
d1c0: 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
d1d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d1e0: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
d1f0: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
d200: 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
d210: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
d220: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
d230: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
d240: 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
d250: 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
d260: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
d270: 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
d280: 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
d290: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
d2a0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
d2b0: 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
d2c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
d2d0: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
d2e0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
d2f0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
d300: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
d310: 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  HE.  sqlite3_mut
d320: 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42  ex *pMaster;.  B
d330: 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
d340: 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
d350: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
d360: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
d370: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
d380: 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73  );.  pMaster = s
d390: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
d3a0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
d3b0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
d3c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d3d0: 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
d3e0: 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
d3f0: 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
d400: 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
d410: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
d420: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
d430: 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
d440: 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
d450: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
d460: 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
d470: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
d480: 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
d490: 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
d4a0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
d4b0: 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
d4c0: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
d4d0: 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
d4e0: 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
d4f0: 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
d500: 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
d510: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
d520: 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
d530: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
d540: 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
d550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d560: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
d570: 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
d580: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d590: 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
d5a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
d5b0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
d5c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d5d0: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
d5e0: 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
d5f0: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
d600: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
d610: 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
d620: 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
d630: 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
d640: 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
d650: 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
d660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d670: 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
d680: 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
d690: 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
d6a0: 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
d6b0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
d6c0: 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
d6d0: 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
d6e0: 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e );.  }.}../*.*
d6f0: 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
d700: 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
d710: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
d720: 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
d730: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
d740: 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  {.  sqlite3PageF
d750: 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70  ree( pBt->pTmpSp
d760: 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d  ace);.  pBt->pTm
d770: 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  pSpace = 0;.}../
d780: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
d790: 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
d7a0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
d7b0: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
d7c0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
d7d0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
d7e0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
d7f0: 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
d800: 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
d810: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
d820: 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
d830: 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
d840: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d850: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
d860: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
d870: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
d880: 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
d890: 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
d8a0: 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
d8b0: 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
d8c0: 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
d8d0: 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
d8e0: 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
d8f0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
d900: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
d910: 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
d920: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
d930: 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
d940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
d950: 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
d960: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
d970: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
d980: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
d990: 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
d9a0: 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
d9b0: 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
d9c0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
d9d0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
d9e0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
d9f0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
da00: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
da10: 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
da20: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
da30: 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
da40: 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
da50: 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
da60: 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
da70: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
da80: 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
da90: 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
daa0: 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
dab0: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
dac0: 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
dad0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
dae0: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
daf0: 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
db00: 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
db10: 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
db20: 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
db30: 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
db40: 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
db50: 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
db60: 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
db70: 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
db80: 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
db90: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
dba0: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
dbb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
dbc0: 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
dbd0: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
dbe0: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
dbf0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
dc00: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
dc10: 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
dc20: 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
dc30: 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
dc40: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
dc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
dc60: 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
dc70: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
dc80: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
dc90: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
dca0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
dcb0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
dcc0: 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
dcd0: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
dce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
dcf0: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
dd00: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
dd10: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
dd20: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
dd30: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
dd40: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
dd50: 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
dd60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
dd70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dd80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dd90: 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
dda0: 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
ddb0: 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
ddc0: 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
ddd0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
dde0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
ddf0: 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
de00: 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
de10: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
de20: 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
de30: 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
de40: 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
de50: 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
de60: 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
de70: 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
de80: 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
de90: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
dea0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
deb0: 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
dec0: 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
ded0: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
dee0: 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
def0: 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
df00: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
df10: 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
df20: 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
df30: 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
df40: 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
df50: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
df60: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
df70: 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
df80: 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
df90: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
dfa0: 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
dfb0: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
dfc0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
dfd0: 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
dfe0: 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
dff0: 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
e000: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
e010: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
e020: 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
e030: 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
e040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
e050: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
e060: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
e070: 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
e080: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
e090: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e0a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e0b0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
e0c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
e0d0: 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
e0e0: 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
e0f0: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
e100: 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
e110: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
e120: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e130: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
e140: 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
e150: 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
e160: 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
e170: 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
e180: 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
e190: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
e1a0: 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
e1b0: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
e1c0: 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
e1d0: 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
e1e0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
e1f0: 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
e200: 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
e210: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
e220: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
e230: 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
e240: 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
e250: 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
e260: 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
e270: 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
e280: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
e290: 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
e2a0: 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
e2b0: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
e2c0: 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
e2d0: 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
e2e0: 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
e2f0: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
e300: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
e310: 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
e320: 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74  te3BtreeSetSafet
e330: 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c  yLevel(Btree *p,
e340: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
e350: 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53  fullSync){.  BtS
e360: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
e370: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
e380: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e390: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
e3a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
e3b0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
e3c0: 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
e3d0: 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61  tyLevel(pBt->pPa
e3e0: 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c  ger, level, full
e3f0: 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
e400: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
e410: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e420: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
e430: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
e440: 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
e450: 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
e460: 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
e470: 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
e480: 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
e490: 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
e4a0: 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
e4b0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
e4c0: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
e4d0: 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
e4e0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
e4f0: 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
e500: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e510: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e520: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
e530: 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
e540: 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
e550: 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
e560: 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
e570: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
e580: 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
e590: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
e5a0: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
e5b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64  rn rc;.}..#if !d
e5c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e5d0: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
e5e0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
e5f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
e600: 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  )./*.** Change t
e610: 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
e620: 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
e630: 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
e640: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
e650: 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
e660: 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
e670: 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
e680: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
e690: 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
e6a0: 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
e6b0: 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
e6c0: 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
e6d0: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
e6e0: 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
e6f0: 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
e700: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
e710: 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
e720: 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
e730: 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
e740: 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
e750: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
e760: 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
e770: 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
e780: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
e790: 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
e7a0: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
e7b0: 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
e7c0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
e7d0: 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
e7e0: 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
e7f0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
e800: 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
e810: 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
e820: 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
e830: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e840: 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
e850: 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
e860: 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
e870: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
e880: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
e890: 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
e8a0: 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
e8b0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
e8c0: 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
e8d0: 68 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65  hen the pageSize
e8e0: 46 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65  Fixed flag is se
e8f0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
e900: 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
e910: 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
e920: 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
e930: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
e940: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
e950: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
e960: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
e970: 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
e980: 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
e990: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e9a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
e9b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
e9c0: 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
e9d0: 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
e9e0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
e9f0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
ea00: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
ea10: 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  ixed ){.    sqli
ea20: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
ea30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ea40: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
ea50: 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
ea60: 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
ea70: 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
ea80: 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
ea90: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
eaa0: 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
eab0: 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
eac0: 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
ead0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
eae0: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
eaf0: 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
eb00: 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
eb10: 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
eb20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
eb30: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
eb40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
eb50: 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20  !pBt->pPage1 && 
eb60: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
eb70: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
eb80: 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
eb90: 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
eba0: 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
ebb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ebc0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
ebd0: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
ebe0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  pageSize);.  }. 
ebf0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
ec00: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
ec10: 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
ec20: 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
ec30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
ec40: 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  d = 1;.  sqlite3
ec50: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
ec60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ec70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
ec80: 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
ec90: 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
eca0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
ecb0: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
ecc0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
ecd0: 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
ece0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ecf0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ed00: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
ed10: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
ed20: 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
ed30: 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
ed40: 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
ed50: 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
ed60: 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
ed70: 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
ed80: 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
ed90: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
eda0: 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
edb0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
edc0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
edd0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
ede0: 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
edf0: 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
ee00: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
ee10: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
ee20: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
ee30: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
ee40: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
ee50: 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
ee60: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
ee70: 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
ee80: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
ee90: 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
eea0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
eeb0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
eec0: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
eed0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
eee0: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
eef0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
ef00: 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
ef10: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
ef20: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
ef30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
ef40: 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
ef50: 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
ef60: 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
ef70: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
ef80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
ef90: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
efa0: 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   n;.}.#endif /* 
efb0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
efc0: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
efd0: 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
efe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
eff0: 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
f000: 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
f010: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
f020: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
f030: 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
f040: 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
f050: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
f060: 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
f070: 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
f080: 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
f090: 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
f0a0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
f0b0: 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
f0c0: 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
f0d0: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
f0e0: 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
f0f0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
f100: 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
f110: 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
f120: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
f130: 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
f140: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
f150: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f160: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f170: 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
f180: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
f190: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
f1a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f1b0: 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
f1c0: 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
f1d0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
f1e0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
f1f0: 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28  geSizeFixed && (
f200: 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
f210: 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
f220: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
f230: 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
f240: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
f250: 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
f260: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
f270: 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
f280: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
f290: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
f2a0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
f2b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f2c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
f2d0: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
f2e0: 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
f2f0: 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
f300: 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
f310: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
f320: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
f330: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
f340: 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
f350: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
f360: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f370: 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
f380: 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
f390: 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
f3a0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
f3b0: 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
f3c0: 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
f3d0: 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
f3e0: 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
f3f0: 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
f400: 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
f410: 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
f420: 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
f430: 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
f440: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
f450: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
f460: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
f470: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
f480: 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
f490: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
f4a0: 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
f4b0: 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
f4c0: 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
f4d0: 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
f4e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
f4f0: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
f500: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
f510: 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
f520: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
f530: 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
f540: 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
f550: 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
f560: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
f570: 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
f580: 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
f590: 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
f5a0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
f5b0: 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
f5c0: 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
f5d0: 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
f5e0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
f5f0: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
f600: 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e  *pPage1;.  int n
f610: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
f620: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f630: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
f640: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
f650: 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
f660: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
f670: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
f680: 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
f690: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f6a0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
f6b0: 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
f6c0: 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
f6d0: 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
f6e0: 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
f6f0: 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
f700: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
f710: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
f720: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
f730: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
f740: 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
f750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f760: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
f770: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c  it_failed;.  }el
f780: 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  se if( nPage>0 )
f790: 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69  {.    int pageSi
f7a0: 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62  ze;.    int usab
f7b0: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
f7c0: 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
f7d0: 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
f7e0: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
f7f0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
f800: 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
f810: 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
f820: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
f830: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
f840: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
f850: 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
f860: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
f870: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f880: 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
f890: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
f8a0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
f8b0: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  }..    /* The ma
f8c0: 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66  ximum embedded f
f8d0: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
f8e0: 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e  exactly 25%.  An
f8f0: 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20  d the minimum.  
f900: 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72    ** embedded fr
f910: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31  action must be 1
f920: 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65  2.5% for both le
f930: 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d  af-data and non-
f940: 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a  leaf-data..    *
f950: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
f960: 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
f970: 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
f980: 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
f990: 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
f9a0: 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
f9b0: 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
f9c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f9d0: 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
f9e0: 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
f9f0: 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
fa00: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
fa10: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
fa20: 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
fa30: 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
fa40: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
fa50: 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
fa60: 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
fa70: 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20  ize<512 ||.     
fa80: 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50     (SQLITE_MAX_P
fa90: 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26  AGE_SIZE<32768 &
faa0: 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  & pageSize>SQLIT
fab0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
fac0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
fad0: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
fae0: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
faf0: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
fb00: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
fb10: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
fb20: 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
fb30: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  0];.    if( page
fb40: 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
fb50: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
fb60: 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
fb70: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
fb80: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
fb90: 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
fba0: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
fbb0: 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
fbc0: 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
fbd0: 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
fbe0: 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
fbf0: 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
fc00: 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
fc10: 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
fc20: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
fc30: 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
fc40: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
fc50: 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
fc60: 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
fc70: 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
fc80: 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
fc90: 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
fca0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
fcb0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
fcc0: 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
fcd0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75  >usableSize = (u
fce0: 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  16)usableSize;. 
fcf0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
fd00: 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
fd10: 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
fd20: 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
fd30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fd40: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
fd50: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
fd60: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
fd70: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
fd80: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
fd90: 69 6c 65 64 3b 0a 20 20 20 20 20 20 72 65 74 75  iled;.      retu
fda0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fdb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
fdc0: 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20  leSize<500 ){.  
fdd0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
fde0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
fdf0: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
fe00: 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
fe10: 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
fe20: 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29  ableSize = (u16)
fe30: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
fe40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fe50: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
fe60: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
fe70: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
fe80: 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
fe90: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
fea0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
feb0: 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
fec0: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
fed0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
fee0: 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
fef0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
ff00: 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
ff10: 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
ff20: 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
ff30: 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
ff40: 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
ff50: 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
ff60: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
ff70: 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
ff80: 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
ff90: 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
ffa0: 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
ffb0: 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
ffc0: 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
ffd0: 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
ffe0: 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
fff0: 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
10000 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
10010 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
10020 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
10030 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
10040 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
10050 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
10060 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
10070 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
10080 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
10090 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72   a 2-byte poiner
100a0 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
100b0 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
100c0 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
100d0 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
100e0 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
100f0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
10100 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
10110 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
10120 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
10130 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
10140 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
10150 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
10160 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
10170 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
10180 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  2/255 - 23;.  pB
10190 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74  t->maxLeaf = pBt
101a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
101b0 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  5;.  pBt->minLea
101c0 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  f = (pBt->usable
101d0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
101e0 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20  - 23;.  assert( 
101f0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
10200 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
10210 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
10220 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
10230 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10240 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
10250 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
10260 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
10270 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
10280 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
10290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
102a0 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
102b0 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78  e lockBtree() ex
102c0 63 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73  cept that it als
102d0 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a  o invokes the.**
102e0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
102f0 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20  f there is lock 
10300 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73  contention..*/.s
10310 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
10320 72 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72  reeWithRetry(Btr
10330 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74  ee *pRef){.  int
10340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10350 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
10360 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
10370 65 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66  ex(pRef) );.  if
10380 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d  ( pRef->inTrans=
10390 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
103a0 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74     u8 inTransact
103b0 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d  ion = pRef->pBt-
103c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a  >inTransaction;.
103d0 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
103e0 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63  ty(pRef);.    rc
103f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
10400 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20  eginTrans(pRef, 
10410 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42  0);.    pRef->pB
10420 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
10430 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e   = inTransaction
10440 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72  ;.    pRef->inTr
10450 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
10460 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10480 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61   pRef->pBt->nTra
10490 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
104a0 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  }.    btreeInteg
104b0 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a  rity(pRef);.  }.
104c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20    return rc;.}. 
104d0 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66        ../*.** If
104e0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
104f0 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
10500 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
10510 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
10520 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
10530 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
10540 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
10550 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
10560 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
10570 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
10580 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
10590 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
105a0 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
105b0 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
105c0 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
105d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
105e0 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e   are any outstan
105f0 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68  ding cursors, th
10600 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10610 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
10620 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
10630 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
10640 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
10650 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10660 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
10670 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
10680 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10690 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
106a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
106b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
106c0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
106d0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
106e0 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72   && pBt->pCursor
106f0 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ==0 && pBt->pPag
10700 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  e1!=0 ){.    if(
10710 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
10720 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
10730 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61  r)>=1 ){.      a
10740 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
10750 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
10760 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
10770 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt->pPage1);.   
10780 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67   }.    pBt->pPag
10790 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
107a0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
107b0 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  w database by in
107c0 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
107d0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
107e0 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  .** file..*/.sta
107f0 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
10800 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
10810 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
10820 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
10830 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
10840 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65   rc;.  int nPage
10850 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
10860 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10870 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10890 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
108a0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
108b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
108c0 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30  TE_OK || nPage>0
108d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
108e0 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  c;.  }.  pP1 = p
108f0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
10900 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
10910 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
10920 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
10930 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
10940 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
10950 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
10960 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
10970 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
10980 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
10990 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
109a0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
109b0 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
109c0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
109d0 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
109e0 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
109f0 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
10a00 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
10a10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
10a20 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
10a30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
10a40 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
10a50 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
10a60 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
10a70 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
10a80 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
10a90 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
10aa0 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
10ab0 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
10ac0 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
10ad0 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
10ae0 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
10af0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
10b00 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
10b10 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
10b20 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
10b30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10b40 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
10b50 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
10b60 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
10b70 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
10b80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
10b90 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
10ba0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
10bb0 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
10bc0 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
10bd0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
10be0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
10bf0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
10c00 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
10c10 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
10c20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10c30 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
10c40 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
10c50 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
10c60 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
10c70 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
10c80 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10c90 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
10ca0 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
10cb0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
10cc0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
10cd0 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
10ce0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
10cf0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
10d00 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
10d10 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
10d20 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
10d30 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
10d40 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
10d50 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
10d60 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
10d70 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
10d80 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
10d90 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
10da0 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
10db0 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
10dc0 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
10dd0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
10de0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
10df0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
10e00 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
10e10 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
10e20 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
10e30 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
10e40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
10e50 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
10e60 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
10e70 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
10e80 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
10e90 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
10ea0 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
10eb0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
10ec0 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
10ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
10ee0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
10ef0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
10f00 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
10f10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10f20 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
10f30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10f40 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
10f50 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
10f60 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
10f70 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
10f80 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
10f90 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
10fa0 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
10fb0 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
10fc0 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
10fd0 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
10fe0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
10ff0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
11000 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
11010 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
11020 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
11030 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
11040 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
11050 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
11060 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
11070 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
11080 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
11090 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
110a0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
110b0 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
110c0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
110d0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
110e0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
110f0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
11100 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
11110 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
11120 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
11130 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
11140 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
11150 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
11160 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
11170 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
11180 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
11190 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
111a0 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
111b0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
111c0 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
111d0 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
111e0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
111f0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
11200 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
11210 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
11220 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
11230 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
11240 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
11250 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
11260 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
11270 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
11280 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
11290 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
112a0 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
112b0 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
112c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
112d0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
112e0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
112f0 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
11300 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
11310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11320 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
11330 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
11340 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11350 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
11360 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
11370 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
11380 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
11390 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
113a0 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
113b0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
113c0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
113d0 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
113e0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
113f0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
11400 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
11410 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
11420 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
11430 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
11440 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
11450 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
11460 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
11470 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
11480 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
11490 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
114a0 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
114b0 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
114c0 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
114d0 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
114e0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
114f0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
11500 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
11510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11520 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
11530 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
11540 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
11550 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
11560 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
11570 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
11580 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
11590 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
115a0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
115b0 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
115c0 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
115d0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
115e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
115f0 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
11600 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11610 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e  _WRITE) || pBt->
11620 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20  isPending ){.   
11630 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
11640 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
11650 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
11660 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
11670 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
11680 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
11690 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
116a0 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
116b0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
116c0 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
116d0 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
116e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
116f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11710 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
11720 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
11730 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
11740 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
11750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
11760 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
11770 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
11780 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
11790 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  f..  do {.    /*
117a0 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
117b0 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
117c0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
117d0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
117e0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
117f0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
11800 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
11810 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
11820 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
11830 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
11840 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
11850 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
11860 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
11870 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
11880 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
11890 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
118a0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
118b0 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
118c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
118d0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
118e0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
118f0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
11900 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
11910 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
11920 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
11930 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
11940 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
11950 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
11960 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
11970 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
11980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11990 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
119a0 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
119b0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
119c0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
119d0 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
119e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
119f0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
11a00 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
11a10 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
11a20 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
11a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11a40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11a50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
11a60 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
11a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11a80 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
11a90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11aa0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
11ab0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
11ac0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
11ad0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
11ae0 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
11af0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11b00 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
11b10 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
11b20 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
11b30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
11b40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
11b50 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
11b60 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
11b70 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
11b80 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ion++;.    }.   
11b90 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
11ba0 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
11bb0 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
11bc0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
11bd0 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
11be0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
11bf0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11c00 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
11c10 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
11c20 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
11c30 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72  CACHE.    if( wr
11c40 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73  flag ){.      as
11c50 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
11c60 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
11c70 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
11c80 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c       pBt->isExcl
11c90 75 73 69 76 65 20 3d 20 28 75 38 29 28 77 72 66  usive = (u8)(wrf
11ca0 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65  lag>1);.    }.#e
11cb0 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73  ndif.  }...trans
11cc0 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
11cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
11ce0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
11cf0 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
11d00 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
11d10 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
11d20 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
11d30 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
11d40 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
11d50 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
11d60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
11d70 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
11d80 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
11d90 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
11da0 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
11db0 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
11dc0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11dd0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
11de0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
11df0 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
11e00 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
11e10 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
11e20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11e30 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11e40 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
11e50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11e60 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
11e70 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
11e80 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
11e90 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
11ea0 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
11eb0 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
11ec0 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
11ed0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
11ee0 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
11ef0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
11f00 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
11f10 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
11f20 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
11f30 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
11f40 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
11f50 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
11f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f80 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
11f90 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
11fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11fc0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
11fd0 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
11fe0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
12010 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
12020 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
12030 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
12040 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
12050 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
12060 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
12070 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12080 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
12090 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
120a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
120b0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
120c0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
120d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
120e0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
120f0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
12100 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
12110 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
12120 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
12130 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
12140 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
12150 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
12160 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
12170 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
12180 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12190 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
121a0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
121b0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
121c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
121d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
121e0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
121f0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
12200 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
12210 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
12220 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
12230 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
12240 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12250 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
12260 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
12270 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
12280 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
12290 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
122a0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
122b0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
122c0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
122d0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
122e0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
122f0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
12300 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
12310 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
12320 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
12330 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
12340 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
12350 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12360 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
12370 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
12380 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
12390 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
123a0 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
123b0 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
123c0 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
123d0 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
123e0 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
123f0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
12400 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
12410 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
12420 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
12430 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
12440 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
12450 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
12460 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
12470 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
12480 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
12490 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
124c0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
124d0 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
124e0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
124f0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
12500 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
12510 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
12520 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
12530 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
12540 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
12550 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
12560 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
12570 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
12580 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
12590 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
125a0 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
125c0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
125d0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
125e0 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
125f0 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
12600 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
12610 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
12620 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
12630 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12640 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12650 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
12660 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12670 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
12680 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
12690 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
126a0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
126b0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
126c0 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
126d0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
126e0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
126f0 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
12700 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
12710 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
12720 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
12730 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12740 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12750 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
12760 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
12770 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
12780 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
12790 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
127a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
127b0 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69  nCell;..    sqli
127c0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
127d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
127e0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
127f0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
12800 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
12810 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
12820 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
12830 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
12840 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
12850 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
12860 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
12870 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12880 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
12890 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
128a0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
128b0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
128c0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
128d0 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
128e0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
128f0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
12900 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
12910 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
12920 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
12930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
12940 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
12950 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
12960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12970 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
12980 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
12990 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
129a0 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
129b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
129c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
129d0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
129e0 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
129f0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
12a00 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
12a10 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
12a20 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
12a30 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
12a40 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
12a50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12a60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
12a70 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
12a80 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
12a90 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
12aa0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
12ab0 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
12ac0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12ad0 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
12ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12af0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
12b00 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
12b10 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
12b20 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
12b30 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
12b40 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
12b50 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
12b60 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
12b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12b80 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
12b90 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
12ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
12bb0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
12bc0 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
12bd0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
12be0 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
12bf0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
12c00 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
12c10 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
12c20 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
12c30 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
12c40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12c50 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
12c60 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
12c70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
12c80 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
12c90 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
12ca0 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
12cb0 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
12cc0 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50  Commit.){.  MemP
12cd0 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
12ce0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
12cf0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
12d00 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
12d10 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
12d20 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
12d30 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
12d40 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
12d50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
12d60 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
12d70 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
12d80 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
12d90 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
12da0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
12db0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
12dc0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
12dd0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
12de0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12df0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
12e00 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
12e10 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
12e20 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
12e30 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
12e40 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
12e50 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
12e60 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
12e70 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
12e80 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
12e90 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
12ea0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
12eb0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
12ec0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
12ed0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
12ee0 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
12ef0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
12f00 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
12f10 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
12f20 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
12f30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12f40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
12f50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
12f60 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
12f70 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
12f80 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
12f90 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
12fa0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
12fb0 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
12fc0 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
12fd0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
12fe0 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
12ff0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
13000 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
13010 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
13020 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
13030 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
13040 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
13050 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
13060 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
13070 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
13080 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
13090 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
130a0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
130b0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
130c0 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
130d0 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
130e0 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
130f0 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
13100 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
13110 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
13120 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
13130 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
13140 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
13150 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
13160 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
13170 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13180 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13190 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
131a0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
131b0 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
131c0 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
131d0 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
131e0 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
131f0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
13200 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
13210 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
13220 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
13230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
13250 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
13260 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13270 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
13280 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
13290 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
132a0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
132b0 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
132c0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
132d0 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
132e0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
132f0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
13300 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
13310 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
13320 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
13330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13340 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
13350 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
13360 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
13370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13380 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13390 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
133a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
133b0 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
133c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
133d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
133e0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
133f0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
13400 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13410 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
13420 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
13430 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
13440 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
13450 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
13460 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
13470 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13490 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
134a0 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
134b0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
134c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
134d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
134e0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
134f0 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
13500 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
13510 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
13520 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
13530 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
13540 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
13550 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
13560 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
13570 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
13580 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
13590 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
135a0 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
135b0 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
135c0 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
135d0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
135e0 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
135f0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
13600 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
13610 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
13620 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
13630 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
13640 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
13650 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
13660 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
13670 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
13680 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
13690 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
136a0 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
136b0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
136c0 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
136d0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
136e0 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  o, the implement
136f0 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a  ation assumes.**
13700 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
13710 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
13720 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
13730 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20  p() until.** it 
13740 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
13750 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c  ONE or an error,
13760 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69   and that nFin i
13770 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
13780 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74  of pages the dat
13790 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
137a0 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68  contain after th
137b0 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  is .** process i
137c0 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73  s complete..*/.s
137d0 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
137e0 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
137f0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
13800 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
13810 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
13820 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
13830 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13840 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
13850 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
13860 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13870 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
13880 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
13890 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
138a0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
138b0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
138c0 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
138d0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
138e0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
138f0 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
13900 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
13910 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
13920 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
13930 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
13940 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
13950 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
13960 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13970 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
13980 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
13990 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
139a0 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
139b0 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
139c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
139d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
139e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
139f0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
13a00 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
13a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
13a30 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
13a40 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
13a50 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
13a60 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
13a70 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
13a80 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
13a90 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
13aa0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
13ab0 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
13ac0 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
13ad0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
13ae0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
13af0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
13b00 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
13b10 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
13b20 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
13b30 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
13b40 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
13b50 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
13b60 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
13b70 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
13b80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13b90 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
13ba0 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
13bb0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
13bc0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
13bd0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
13be0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
13bf0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
13c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
13c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13c20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13c30 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13c40 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
13c50 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
13c60 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
13c70 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
13c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
13c90 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
13ca0 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
13cb0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
13cc0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
13cd0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
13ce0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
13cf0 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
13d00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13d10 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
13d20 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
13d30 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
13d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13d50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13d60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13d70 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
13d80 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
13d90 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
13da0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
13db0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
13dc0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
13dd0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
13de0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
13df0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
13e00 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
13e10 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
13e20 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
13e30 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
13e40 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
13e50 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
13e60 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
13e70 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
13e80 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
13e90 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
13ea0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
13eb0 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
13ec0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
13ed0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
13ee0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
13ef0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
13f00 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
13f10 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
13f20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13f30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13f40 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
13f50 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
13f60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13f70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
13f80 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
13f90 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
13fa0 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
13fb0 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
13fc0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
13fd0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
13fe0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
13ff0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
14000 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
14010 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
14020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14030 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
14040 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
14050 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
14060 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
14070 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
14080 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
14090 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
140a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
140b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
140c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
140d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
140e0 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
140f0 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
14100 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
14110 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
14120 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
14130 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
14140 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
14150 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
14160 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
14170 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
14180 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
14190 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
141a0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
141b0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50  Bt, iLastPg, &pP
141c0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
141d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
141e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
141f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
14200 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
14210 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
14220 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
14230 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
14240 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
14250 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14260 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14290 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
142a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
142b0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
142c0 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
142d0 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20   iLastPg);.  }. 
142e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
142f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
14300 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
14310 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
14320 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
14330 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
14340 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
14350 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
14360 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
14370 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
14380 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
14390 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
143a0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
143b0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
143c0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
143d0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
143e0 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
143f0 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
14400 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
14410 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
14420 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
14430 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
14440 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
14450 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14460 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
14470 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
14480 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
14490 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
144a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
144b0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
144c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
144d0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
144e0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
144f0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
14500 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
14510 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
14520 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
14530 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
14540 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
14550 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
14560 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
14570 65 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72  ep(pBt, 0, pager
14580 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b  Pagecount(pBt));
14590 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
145a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
145b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
145c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
145d0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
145e0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
145f0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
14600 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
14610 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
14620 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
14630 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
14640 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
14650 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
14660 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
14670 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
14680 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14690 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
146a0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
146b0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
146c0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
146d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
146e0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
146f0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
14700 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
14710 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
14720 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
14730 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
14740 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
14750 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
14760 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
14770 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
14780 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
14790 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
147a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
147b0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
147c0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
147d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
147e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
147f0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
14800 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
14810 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
14820 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
14830 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
14840 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
14850 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20   nFin;.    Pgno 
14860 6e 46 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20  nFree;.    Pgno 
14870 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e  nPtrmap;.    Pgn
14880 6f 20 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e  o iFree;.    con
14890 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  st int pgsz = pB
148a0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  t->pageSize;.   
148b0 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61   Pgno nOrig = pa
148c0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
148d0 29 3b 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d  );..    if( PTRM
148e0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
148f0 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
14900 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
14910 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
14920 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
14930 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
14940 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
14950 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
14960 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
14970 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
14980 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
14990 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
149a0 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
149b0 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
149c0 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
149d0 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
149e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
149f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14a00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
14a10 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
14a20 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
14a30 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
14a40 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
14a50 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
14a60 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
14a70 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
14a80 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20  sz/5);.    nFin 
14a90 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
14aa0 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69  - nPtrmap;.    i
14ab0 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
14ac0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
14ad0 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
14ae0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
14af0 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
14b00 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
14b10 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
14b20 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
14b30 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
14b40 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
14b50 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
14b60 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
14b70 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
14b80 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
14b90 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
14ba0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
14bb0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
14bc0 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
14bd0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
14be0 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
14bf0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
14c00 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
14c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14c20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14c30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
14c40 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
14c50 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
14c60 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
14c70 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
14c80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
14c90 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
14ca0 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
14cb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
14cc0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
14cd0 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
14ce0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
14cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14d00 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14d10 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14d20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14d30 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
14d40 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
14d50 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
14d60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
14d70 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53  ndif /* ifndef S
14d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14d90 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
14da0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
14db0 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
14dc0 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
14dd0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
14de0 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
14df0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
14e00 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
14e10 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
14e20 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
14e30 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
14e40 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
14e50 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
14e60 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
14e70 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
14e80 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
14e90 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
14ea0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
14eb0 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
14ec0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
14ed0 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
14ee0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
14ef0 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
14f00 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
14f10 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
14f20 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
14f30 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
14f40 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
14f50 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
14f60 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
14f70 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
14f80 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
14f90 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
14fa0 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
14fb0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
14fc0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
14fd0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
14fe0 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
14ff0 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
15000 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
15010 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
15020 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
15030 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
15040 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
15050 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
15060 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
15070 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
15080 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
15090 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
150a0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
150b0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
150c0 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
150d0 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
150e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
150f0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
15100 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
15110 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
15120 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
15130 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
15140 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
15150 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
15160 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
15170 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
15180 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
15190 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
151a0 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
151b0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
151c0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
151d0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
151e0 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
151f0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
15200 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
15210 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
15220 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
15230 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
15240 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
15250 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
15260 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
15270 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
15280 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
15290 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
152a0 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
152b0 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
152c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
152d0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
152e0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
152f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
15300 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
15310 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
15320 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
15330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15340 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
15350 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
15360 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
15370 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15380 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15390 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
153a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
153b0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
153c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
153d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
153e0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
153f0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
15400 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
15420 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
15430 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
15450 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
15460 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
15470 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
15480 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
15490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
154a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
154b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
154c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
154d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
154e0 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
154f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
15500 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
15510 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
15520 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
15530 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
15540 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15550 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
15560 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
15570 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
15580 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
15590 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
155a0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
155b0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
155c0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
155d0 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
155e0 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
155f0 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
15600 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
15610 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
15620 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
15630 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
15640 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
15650 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
15660 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
15670 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
15680 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
15690 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
156a0 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
156b0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
156c0 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
156d0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
156e0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
156f0 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
15700 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ks..**.** This w
15710 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
15720 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
15730 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15740 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
15750 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
15760 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
15770 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
15780 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
15790 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
157a0 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29  aseTwo(Btree *p)
157b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
157c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
157d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
157e0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
157f0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
15800 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
15810 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
15820 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
15830 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
15840 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
15850 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
15860 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
15870 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
15880 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
15890 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
158a0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
158b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
158c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
158d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
158e0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
158f0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
15900 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
15910 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
15920 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
15930 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
15940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15950 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15960 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
15970 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15980 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
15990 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
159a0 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
159b0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
159c0 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  s any kind of tr
159d0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
159e0 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72  decrement the tr
159f0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
15a00 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
15a10 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
15a20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
15a30 6e 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  nt reaches 0, se
15a40 74 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65  t.  ** the share
15a50 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
15a60 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
15a70 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
15a80 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a   call below.  **
15a90 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
15aa0 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   pager..  */.  i
15ab0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
15ac0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
15ad0 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
15ae0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
15af0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  );.    pBt->nTra
15b00 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
15b10 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
15b20 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
15b30 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
15b40 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
15b50 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
15b60 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
15b70 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
15b80 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
15b90 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20  NE and unlock.  
15ba0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20  ** the pager if 
15bb0 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
15bc0 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
15bd0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
15be0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 62 74 72 65  ion..  */.  btre
15bf0 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
15c00 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72  (pBt);.  p->inTr
15c10 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
15c20 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
15c30 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
15c40 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
15c50 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
15c60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15c70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15c80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
15c90 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
15ca0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
15cb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
15cc0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
15cd0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
15ce0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
15cf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
15d00 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
15d10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
15d20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15d30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
15d40 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
15d50 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
15d60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15d70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15d80 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
15d90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15da0 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
15db0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
15dc0 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
15dd0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
15de0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
15df0 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
15e00 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
15e10 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
15e20 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
15e30 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
15e40 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
15e50 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
15e60 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
15e70 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
15e80 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
15e90 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
15ea0 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
15eb0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
15ec0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
15ed0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
15ee0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
15ef0 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
15f00 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
15f10 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
15f20 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
15f30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
15f40 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
15f50 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
15f60 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
15f70 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
15f80 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
15f90 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
15fa0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
15fb0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
15fc0 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
15fd0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
15fe0 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
15ff0 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
16000 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
16010 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
16020 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
16030 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
16040 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
16050 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
16060 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
16070 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
16080 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
16090 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
160a0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
160b0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
160c0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
160d0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
160e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
160f0 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
16100 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
16110 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
16120 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16130 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
16140 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
16150 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
16160 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
16170 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
16180 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
16190 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
161a0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
161b0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
161c0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
161d0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
161e0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
161f0 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
16200 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
16210 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
16220 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
16230 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
16240 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
16250 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
16260 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
16270 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16280 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
16290 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
162a0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
162b0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
162c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
162d0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
162e0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
162f0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
16300 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
16310 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
16320 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
16330 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
16340 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
16350 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
16360 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
16370 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
16380 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
16390 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
163a0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
163b0 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
163c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
163d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
163e0 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
163f0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
16400 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
16410 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
16420 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
16430 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
16440 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
16450 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
16460 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
16470 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
16480 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16490 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
164a0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
164b0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
164c0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
164d0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
164e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
164f0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
16500 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
16510 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
16520 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
16530 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
16540 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16550 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
16560 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
16570 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16580 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
16590 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
165a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
165b0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65  (p);.  rc = save
165c0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
165d0 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
165e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
165f0 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63  D_CACHE.  if( rc
16600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16610 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
16620 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69  horrible situati
16630 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c  on. An IO or mal
16640 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
16650 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  rred whilst.    
16660 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
16670 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
16680 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
16690 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
166a0 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
166b0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
166c0 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
166d0 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
166e0 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
166f0 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
16700 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
16710 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
16720 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
16730 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
16740 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
16750 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
16760 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
16770 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
16780 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
16790 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
167a0 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
167b0 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
167c0 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
167d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
167e0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
167f0 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a  Cursors(p, rc);.
16800 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
16810 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
16820 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
16830 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
16840 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
16850 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
16860 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
16870 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
16880 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
16890 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
168a0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
168b0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
168c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
168d0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
168e0 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
168f0 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
16900 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
16910 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
16920 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c  .    ** call sql
16930 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
16940 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
16950 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
16960 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
16970 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
16980 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
16990 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  ( sqlite3BtreeGe
169a0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
169b0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
169c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
169d0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
169e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
169f0 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
16a00 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
16a10 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
16a20 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
16a30 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66  _READ;.  }..  if
16a40 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
16a50 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
16a60 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
16a70 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
16a80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
16a90 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
16aa0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
16ab0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
16ac0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
16ad0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
16ae0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
16af0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
16b00 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
16b10 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
16b20 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70  ontent(pBt);.  p
16b30 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
16b40 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b  S_NONE;.  unlock
16b50 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
16b60 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  t);..  btreeInte
16b70 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
16b80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16b90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16ba0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
16bb0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
16bc0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
16bd0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
16be0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
16bf0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
16c00 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
16c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
16c20 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
16c30 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
16c40 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
16c50 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
16c60 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
16c70 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
16c80 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
16c90 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
16ca0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
16cb0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
16cc0 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
16cd0 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
16ce0 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
16cf0 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
16d00 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
16d10 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
16d20 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
16d30 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
16d40 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
16d50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
16d60 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
16d70 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
16d80 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
16d90 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
16da0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
16db0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
16dc0 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
16dd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
16de0 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
16df0 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
16e00 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
16e10 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
16e20 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
16e30 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
16e40 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
16e50 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
16e60 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
16e70 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
16e80 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
16e90 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
16ea0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
16eb0 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
16ec0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
16ed0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
16ee0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
16ef0 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
16f00 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
16f10 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
16f20 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
16f30 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
16f40 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
16f50 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
16f60 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
16f70 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
16f80 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
16f90 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
16fa0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
16fb0 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
16fc0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
16fd0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16fe0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16ff0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
17000 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
17010 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
17020 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65   assert( pBt->re
17030 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  adOnly==0 );.  a
17040 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
17050 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
17060 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
17070 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
17080 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
17090 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
170a0 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61  RITE || pBt->rea
170b0 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63  dOnly) ){.    rc
170c0 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
170d0 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AL;.  }else{.   
170e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
170f0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
17100 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
17110 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
17120 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
17130 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
17140 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
17150 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64  th.    ** an ind
17160 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
17170 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
17180 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
17190 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53  y using.    ** S
171a0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
171b0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
171c0 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
171d0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
171e0 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
171f0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
17200 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
17210 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
17220 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f  s active..    */
17230 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17240 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
17250 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
17260 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
17270 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
17280 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17290 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
172a0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
172b0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
172c0 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
172d0 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
172e0 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
172f0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
17300 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
17310 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
17320 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
17330 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
17340 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
17350 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
17360 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
17370 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
17380 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
17390 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
173a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
173b0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
173c0 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
173d0 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
173e0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
173f0 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
17400 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
17410 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
17420 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
17430 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
17440 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
17450 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
17460 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
17470 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
17480 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
17490 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
174a0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
174b0 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
174c0 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
174d0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
174e0 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
174f0 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
17500 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
17510 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17520 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
17530 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
17540 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
17550 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17560 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
17570 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
17580 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
17590 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
175a0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
175b0 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
175c0 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
175d0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
175e0 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
175f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17600 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
17610 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
17620 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
17630 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
17640 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
17650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17660 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
17670 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
17680 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17690 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
176a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
176b0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
176c0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
176d0 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
176e0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
176f0 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
17700 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
17710 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
17720 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
17730 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17740 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
17750 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
17760 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
17770 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
17780 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
17790 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
177a0 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
177b0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
177c0 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
177d0 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
177e0 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
177f0 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
17800 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
17810 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
17820 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
17830 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
17840 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
17850 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
17860 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
17870 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
17880 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
17890 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
178a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
178b0 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
178c0 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
178d0 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
178e0 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
178f0 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
17900 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
17910 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
17920 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
17930 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
17940 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
17950 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
17960 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
17970 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
17980 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
17990 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
179a0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
179b0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
179c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
179d0 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
179e0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
179f0 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
17a00 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
17a10 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
17a20 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
17a30 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
17a40 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
17a50 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
17a60 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
17a70 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
17a80 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
17a90 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
17aa0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
17ab0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
17ac0 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
17ad0 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
17ae0 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
17af0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
17b00 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
17b10 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65  ursorSize() byte
17b20 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  s of memory .** 
17b30 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43  pointed to by pC
17b40 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72  ur have been zer
17b50 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  oed by the calle
17b60 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
17b70 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
17b80 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ba0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
17bb0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
17bc0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
17bf0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
17c00 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
17c30 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
17c40 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
17c50 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
17c60 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
17c70 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
17c80 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
17c90 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
17ca0 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
17cd0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
17ce0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
17cf0 6e 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  nPage;.  BtShare
17d00 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17d10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17d20 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
17d30 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
17d40 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
17d50 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  wrFlag==1 );.  i
17d60 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
17d70 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
17d80 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 69  eadOnly );.    i
17d90 66 28 20 4e 45 56 45 52 28 70 42 74 2d 3e 72 65  f( NEVER(pBt->re
17da0 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
17db0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
17dc0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
17dd0 20 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72     rc = checkFor
17de0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
17df0 20 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a   iTable, 0, 0);.
17e00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17e10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
17e20 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
17e30 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
17e40 41 43 48 45 20 29 3b 0a 20 20 20 20 20 20 72 65  ACHE );.      re
17e50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
17e60 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
17e70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
17e80 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
17e90 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20  thRetry(p);.    
17ea0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17eb0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
17ec0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
17ed0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
17ee0 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
17ef0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17f00 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
17f10 74 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 20  t->pPager, (int 
17f20 2a 29 26 6e 50 61 67 65 29 3b 20 0a 20 20 69 66  *)&nPage); .  if
17f30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17f40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17f50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
17f60 6c 65 3d 3d 31 20 26 26 20 6e 50 61 67 65 3d 3d  le==1 && nPage==
17f70 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
17f80 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  LITE_EMPTY;.    
17f90 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
17fa0 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
17fb0 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
17fc0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
17fd0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
17fe0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
17ff0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18000 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
18010 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
18020 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
18030 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
18040 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
18050 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
18060 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
18070 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
18080 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
18090 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
180a0 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
180b0 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
180c0 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
180d0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
180e0 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
180f0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
18100 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
18110 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
18120 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
18130 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
18140 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
18150 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
18160 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
18170 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
18180 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
18190 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
181a0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
181b0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
181c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
181d0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
181e0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
181f0 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
18200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61  SQLITE_OK;..crea
18210 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
18220 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  ion:.  releasePa
18230 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
18240 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  0]);.  unlockBtr
18250 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
18260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18270 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18280 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
18290 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
182c0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
182d0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
18300 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
18310 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
18320 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18340 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
18350 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
18360 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
18370 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18390 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
183a0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
183b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
183e0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
183f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
18400 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
18410 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
18420 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
18430 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
18440 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
18450 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18460 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18470 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18480 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
18490 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
184a0 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
184b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
184c0 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
184d0 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
184e0 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
184f0 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
18500 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
18510 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
18520 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
18530 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
18540 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
18550 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
18560 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
18570 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
18580 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
18590 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
185a0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
185b0 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
185c0 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43  eturn sizeof(BtC
185d0 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ursor);.}../*.**
185e0 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20   Set the cached 
185f0 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65  rowid value of e
18600 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74  very cursor in t
18610 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
18620 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72   file.** as pCur
18630 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20   and having the 
18640 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
18650 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20  umber as pCur.  
18660 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  The value is.** 
18670 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a  set to iRowid..*
18680 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69  *.** Only positi
18690 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20  ve rowid values 
186a0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76  are considered v
186b0 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61  alid for this ca
186c0 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68  che..** The cach
186d0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
186e0 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61   to zero, indica
186f0 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20  ting an invalid 
18700 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65  cache..** A btre
18710 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  e will work fine
18720 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65   with zero or ne
18730 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20  gative rowids.  
18740 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a  We just cannot.*
18750 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20  * cache zero or 
18760 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c  negative rowids,
18770 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62   which means tab
18780 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72  les that use zer
18790 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65  o or.** negative
187a0 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75   rowids might ru
187b0 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
187c0 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74  r.  But in pract
187d0 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ice, zero.** or 
187e0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
187f0 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f  are very uncommo
18800 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64  n so this should
18810 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
18820 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
18830 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
18840 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
18850 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pCur, sqlite3_in
18860 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42  t64 iRowid){.  B
18870 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
18880 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70  r(p=pCur->pBt->p
18890 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
188a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
188b0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75  p->pgnoRoot==pCu
188c0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d  r->pgnoRoot ) p-
188d0 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69  >cachedRowid = i
188e0 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Rowid;.  }.  ass
188f0 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65  ert( pCur->cache
18900 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29  dRowid==iRowid )
18910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18920 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  n the cached row
18930 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
18940 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61   cursor.  A nega
18950 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  tive or zero.** 
18960 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
18970 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
18980 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69  rowid cache is i
18990 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
189a0 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  d be.** ignored.
189b0 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63    If the rowid c
189c0 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62  ache has never b
189d0 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20  efore been set, 
189e0 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69  then a.** zero i
189f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
18a00 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
18a10 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
18a20 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
18a30 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
18a40 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  n pCur->cachedRo
18a50 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  wid;.}../*.** Cl
18a60 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
18a70 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
18a80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18a90 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
18aa0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
18ab0 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
18ac0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18ad0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
18ae0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
18af0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
18b00 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
18b10 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
18b20 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18b30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18b40 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
18b50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18b60 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
18b70 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
18b80 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
18b90 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
18ba0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
18bb0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
18bc0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
18bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
18be0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
18bf0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
18c00 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
18c10 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
18c20 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
18c30 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
18c40 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
18c50 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
18c60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
18c70 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
18c80 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
18c90 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
18ca0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
18cb0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
18cc0 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
18cd0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
18ce0 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
18cf0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18d00 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
18d10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18d20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18d30 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79  Make a temporary
18d40 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69   cursor by filli
18d50 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73  ng in the fields
18d60 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a   of pTempCur..**
18d70 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   The temporary c
18d80 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20  ursor is not on 
18d90 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20  the cursor list 
18da0 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a  for the Btree..*
18db0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
18dc0 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
18dd0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
18de0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70   BtCursor *pTemp
18df0 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
18e00 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
18e10 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
18e20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d  );.  memcpy(pTem
18e30 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65  pCur, pCur, size
18e40 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20  of(BtCursor));. 
18e50 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74   pTempCur->pNext
18e60 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72   = 0;.  pTempCur
18e70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66  ->pPrev = 0;.  f
18e80 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70  or(i=0; i<=pTemp
18e90 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
18ea0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
18eb0 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e  erRef(pTempCur->
18ec0 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61  apPage[i]->pDbPa
18ed0 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
18ee0 74 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65  t( pTempCur->pKe
18ef0 79 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  y==0 );.}../*.**
18f00 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72   Delete a tempor
18f10 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20  ary cursor such 
18f20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74  as was made by t
18f30 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61  he CreateTempora
18f40 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75  ryCursor().** fu
18f50 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f  nction above..*/
18f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
18f70 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
18f80 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
18f90 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
18fa0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
18fb0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
18fc0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
18fd0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
18fe0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
18ff0 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 61  gerUnref(pCur->a
19000 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67  pPage[i]->pDbPag
19010 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
19020 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
19030 79 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  y);.}..../*.** M
19040 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
19050 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
19060 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
19070 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
19080 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
19090 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
190a0 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
190b0 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65  , call.** sqlite
190c0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
190d0 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
190e0 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
190f0 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
19100 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
19110 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
19120 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
19130 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
19140 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
19150 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  f calls to sqlit
19160 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
19170 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
19180 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
19190 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
191a0 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
191b0 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
191c0 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
191d0 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
191e0 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
191f0 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
19200 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
19210 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
19220 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
19230 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
19240 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
19250 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
19260 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
19270 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
19280 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
19290 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
192a0 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
192b0 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
192c0 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
192d0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
192e0 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
192f0 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
19300 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
19310 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
19320 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
19330 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
19340 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
19350 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
19360 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
19370 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
19380 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
19390 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
193a0 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
193b0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
193c0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
193d0 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
193e0 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
193f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
19400 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
19410 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
19420 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
19430 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
19440 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
19450 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
19460 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
19470 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
19480 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
19490 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
194a0 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
194b0 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
194c0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
194d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
194e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
194f0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
19500 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
19510 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
19520 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19530 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
19540 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
19550 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
19560 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
19570 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
19580 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  NKey = 1;.    }e
19590 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
195a0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
195b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
195c0 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f   /* if not _MSC_
195d0 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20  VER */.  /* Use 
195e0 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f  a macro in all o
195f0 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73  ther compilers s
19600 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
19610 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a  ion is inlined *
19620 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c  /.#define getCel
19630 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20  lInfo(pCur)     
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
19680 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67    \.    int iPag
196d0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33     \.    sqlite3
19720 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
19730 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
19740 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
19750 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
19760 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e  o); \.    pCur->
19770 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
19810 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
19820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19850 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
19860 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
19870 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
19880 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
19890 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
198a0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
198b0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
198c0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
198d0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
198e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
198f0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
19900 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
19910 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
19920 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
19930 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
19940 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
19950 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
19960 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
19970 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
19980 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19990 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
199a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
199b0 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
199c0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
199d0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
199e0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
199f0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19a00 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
19a10 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
19a20 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
19a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19a40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
19a50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19a60 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
19a70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19a80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
19a90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19aa0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
19ab0 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
19ac0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
19ad0 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
19ae0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
19af0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
19b00 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  o.nKey;.    }.  
19b10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19b20 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
19b30 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
19b40 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
19b50 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
19b60 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
19b70 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
19b80 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
19b90 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
19ba0 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
19bb0 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20  ssible.  If the 
19bc0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75  cursor is not cu
19bd0 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
19be0 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  ing to an entry 
19bf0 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65  (which can happe
19c00 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
19c10 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  if.** the databa
19c20 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65  se is empty) the
19c30 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  n *pSize is set 
19c40 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
19c50 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
19c60 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
19c70 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
19c80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
19c90 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19ca0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
19cb0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
19cc0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
19cd0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
19cf0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19d00 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
19d10 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
19d20 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19d30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
19d40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19d50 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
19d60 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
19d70 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
19d80 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
19d90 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
19da0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
19db0 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
19dc0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
19dd0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
19de0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
19df0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19e00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
19e10 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
19e20 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
19e30 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
19e40 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
19e50 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
19e60 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
19e70 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
19e80 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
19e90 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
19ea0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
19eb0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
19ec0 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
19ed0 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
19ee0 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
19ef0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
19f00 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
19f10 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
19f20 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
19f30 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
19f40 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
19f50 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
19f60 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
19f70 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
19f80 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
19f90 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
19fa0 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
19fb0 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
19fc0 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
19fd0 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
19fe0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
19ff0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1a000 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1a010 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1a020 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1a030 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1a040 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1a050 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1a060 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1a070 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1a080 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
1a090 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
1a0a0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
1a0b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1a0c0 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
1a0d0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1a0e0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1a0f0 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
1a100 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
1a110 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
1a120 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
1a130 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
1a140 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
1a150 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
1a160 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
1a170 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
1a180 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
1a190 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
1a1a0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1a1b0 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
1a1c0 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
1a1d0 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
1a1e0 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f  ed *pBt, .  Pgno
1a1f0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1a200 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72           /* Over
1a210 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d  flow page */.  M
1a220 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1a230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a240 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
1a250 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
1a260 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
1a270 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
1a280 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
1a290 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1a2a0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
1a2b0 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
1a2c0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
1a2d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a2e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1a2f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1a300 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1a310 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
1a320 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
1a330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a340 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
1a350 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
1a360 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1a370 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
1a380 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
1a390 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
1a3a0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
1a3b0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
1a3c0 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
1a3d0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
1a3e0 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
1a3f0 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
1a400 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
1a410 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
1a420 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
1a430 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
1a440 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
1a450 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
1a460 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
1a470 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
1a480 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1a490 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1a4a0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
1a4b0 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
1a4c0 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
1a4d0 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
1a4e0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1a4f0 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
1a500 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
1a510 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1a520 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
1a530 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
1a540 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63  uess<=pagerPagec
1a550 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
1a560 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1a570 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
1a580 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
1a590 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1a5a0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
1a5b0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1a5c0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
1a5d0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
1a5e0 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
1a5f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1a600 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1a610 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1a620 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a630 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1a640 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1a650 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1a660 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1a670 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
1a680 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
1a690 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
1a6a0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1a6b0 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1a6c0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1a6d0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1a6e0 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1a6f0 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1a700 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1a710 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1a720 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1a730 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1a740 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
1a750 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
1a760 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
1a770 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
1a780 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1a790 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
1a7a0 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
1a7b0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
1a7c0 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
1a7d0 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
1a7e0 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
1a7f0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
1a800 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
1a810 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
1a820 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
1a830 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
1a840 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
1a850 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
1a860 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
1a870 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
1a880 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
1a890 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
1a8a0 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
1a8b0 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
1a8c0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
1a8d0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1a8e0 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
1a8f0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
1a900 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a910 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1a920 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
1a930 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1a940 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
1a950 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
1a960 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
1a970 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1a980 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
1a990 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1a9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1a9b0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
1a9c0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a9e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1a9f0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
1aa00 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
1aa10 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
1aa20 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
1aa30 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
1aa40 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
1aa50 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1aa60 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1aa70 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1aa80 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1aa90 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1aaa0 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1aab0 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1aac0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1aad0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1aae0 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1aaf0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1ab00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ab10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ab20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1ab30 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1ab40 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1ab50 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1ab60 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1ab70 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1ab80 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1ab90 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1aba0 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1abb0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1abc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1abd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1abe0 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1abf0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1ac00 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1ac10 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1ac20 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1ac30 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1ac40 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1ac50 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1ac60 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1ac70 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1ac80 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1ac90 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1aca0 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1acb0 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1acc0 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1acd0 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1ace0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1acf0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1ad00 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1ad10 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1ad20 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1ad30 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1ad40 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1ad50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1ad60 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
1ad70 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
1ad80 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
1ad90 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
1ada0 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
1adb0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
1adc0 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
1add0 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
1ade0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1adf0 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
1ae00 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1ae10 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
1ae20 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
1ae30 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1ae40 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1ae50 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1ae60 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1ae70 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1ae80 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1ae90 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1aea0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1aeb0 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1aec0 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1aed0 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1aee0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1aef0 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1af00 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1af10 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1af20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1af30 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1af40 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1af50 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1af60 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1af70 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1af80 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1af90 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1afa0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1afb0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1afc0 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1afd0 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1afe0 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1aff0 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1b000 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1b010 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1b020 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1b030 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1b040 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1b050 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1b060 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1b070 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1b080 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1b090 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1b0a0 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1b0b0 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1b0c0 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1b0d0 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1b0e0 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1b0f0 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1b100 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1b110 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1b120 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1b130 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1b140 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1b150 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1b160 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1b170 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1b180 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1b190 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1b1a0 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1b1b0 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1b1c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b1d0 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1b1e0 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1b1f0 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1b200 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1b210 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1b220 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
1b230 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
1b240 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
1b250 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1b260 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1b270 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1b280 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1b290 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1b2a0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1b2b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1b2c0 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1b2d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1b2e0 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1b2f0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1b300 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1b310 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1b320 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1b330 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1b340 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1b350 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1b360 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1b370 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1b380 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1b390 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1b3a0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1b3b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1b3c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b3d0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1b3e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1b3f0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1b400 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1b410 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1b420 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1b430 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1b440 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1b450 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1b460 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1b470 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1b480 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1b490 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1b4a0 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1b4b0 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1b4c0 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
1b4d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
1b4e0 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
1b4f0 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a  ur->info.nData .
1b500 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
1b510 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1b520 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
1b530 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
1b540 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
1b550 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
1b560 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
1b570 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
1b580 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
1b590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b5a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b5b0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1b5c0 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
1b5d0 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
1b5e0 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
1b5f0 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
1b600 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
1b610 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1b620 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
1b630 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
1b640 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
1b650 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
1b660 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1b670 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
1b680 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
1b690 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1b6a0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
1b6b0 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
1b6c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
1b6d0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1b6e0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
1b6f0 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
1b700 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
1b710 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1b720 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
1b730 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1b740 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
1b750 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
1b760 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1b770 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
1b780 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
1b790 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
1b7a0 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
1b7b0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
1b7c0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
1b7d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1b7e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1b7f0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1b800 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1b810 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1b820 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
1b830 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
1b840 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
1b850 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1b860 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
1b870 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
1b880 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
1b890 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
1b8a0 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
1b8b0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
1b8c0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1b8d0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
1b8e0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
1b8f0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1b900 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
1b910 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
1b920 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
1b930 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
1b940 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
1b950 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
1b960 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
1b970 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
1b980 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
1b990 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1b9a0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1b9b0 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1b9c0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
1b9d0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
1b9e0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
1b9f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1ba00 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
1ba10 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
1ba20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
1ba30 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
1ba40 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
1ba50 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
1ba60 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26      if( nOvfl &&
1ba70 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1ba80 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
1ba90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1baa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1bab0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
1bac0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1bad0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1bae0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
1baf0 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
1bb00 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
1bb10 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
1bb20 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
1bb30 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
1bb40 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
1bb50 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1bb60 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1bb70 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
1bb80 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
1bb90 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
1bba0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
1bbb0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1bbc0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1bbd0 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
1bbe0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
1bbf0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
1bc00 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
1bc10 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1bc20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
1bc30 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
1bc40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bc50 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1bc60 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
1bc70 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
1bc80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1bc90 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
1bca0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1bcb0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1bcc0 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
1bcd0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1bce0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
1bcf0 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
1bd00 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
1bd10 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1bd20 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
1bd30 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1bd40 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
1bd50 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
1bd60 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
1bd70 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
1bd80 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
1bd90 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
1bda0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1bdb0 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
1bdc0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1bdd0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
1bde0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
1bdf0 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
1be00 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
1be10 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
1be20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
1be30 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
1be40 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
1be50 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
1be60 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
1be70 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
1be80 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
1be90 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1bea0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1beb0 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
1bec0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1bed0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1bee0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
1bef0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1bf00 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1bf10 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
1bf20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
1bf30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1bf40 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1bf50 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
1bf60 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
1bf70 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
1bf80 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
1bf90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1bfa0 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
1bfb0 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
1bfc0 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
1bfd0 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
1bfe0 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
1bff0 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
1c000 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
1c010 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
1c020 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
1c030 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
1c040 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
1c050 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1c060 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c070 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
1c080 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
1c090 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
1c0a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c0b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c0c0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
1c0d0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1c0e0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
1c0f0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1c100 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
1c110 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
1c120 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
1c130 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
1c140 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
1c150 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
1c160 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c170 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
1c180 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1c190 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
1c1a0 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
1c1b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1c1c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1c1d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1c1e0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1c1f0 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
1c200 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
1c210 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
1c220 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c230 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1c240 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1c250 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1c260 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c270 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1c280 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c290 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1c2a0 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
1c2b0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1c2c0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1c2d0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1c2e0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1c2f0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1c300 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1c310 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1c320 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1c330 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1c340 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1c350 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1c360 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1c370 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1c380 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1c390 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1c3a0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1c3b0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1c3c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1c3d0 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
1c3e0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1c3f0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1c400 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1c410 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1c420 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1c430 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1c440 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1c450 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1c460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c470 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1c480 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c490 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1c4a0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1c4b0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1c4c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c4d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1c4e0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1c4f0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
1c500 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c510 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1c520 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1c530 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1c540 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1c550 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1c560 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1c570 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1c580 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1c590 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1c5a0 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20  *)pBuf, 0, 0);. 
1c5b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c5c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1c5d0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1c5e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1c5f0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1c600 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1c610 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1c620 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1c630 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1c640 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1c650 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1c660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1c670 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1c680 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1c690 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1c6a0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1c6b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1c6c0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1c6d0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1c6e0 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1c6f0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1c700 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1c710 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1c720 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1c730 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1c740 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1c750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1c760 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1c770 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c780 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1c790 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c7a0 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1c7b0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1c7c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c7d0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1c7e0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1c7f0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1c800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c810 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c820 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c830 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1c840 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1c850 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1c860 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1c870 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1c880 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1c890 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1c8a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1c8b0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1c8c0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1c8d0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1c8e0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1c8f0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
1c900 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c910 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1c920 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1c930 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1c940 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1c950 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1c960 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1c970 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1c980 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1c990 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1c9a0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1c9b0 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1c9c0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1c9d0 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1c9e0 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1c9f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1ca00 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1ca10 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1ca20 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1ca30 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1ca40 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1ca50 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1ca60 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1ca70 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1ca80 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1ca90 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1caa0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1cab0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1cac0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1cad0 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1cae0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1caf0 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1cb00 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1cb10 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1cb20 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1cb30 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1cb40 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1cb50 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1cb60 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1cb70 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1cb80 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1cb90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1cba0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
1cbb0 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
1cbc0 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
1cbd0 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
1cbe0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
1cbf0 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
1cc00 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
1cc10 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1cc20 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
1cc30 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
1cc40 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
1cc50 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
1cc60 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1cc70 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
1cc80 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
1cc90 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
1cca0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
1ccb0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1ccc0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
1ccd0 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
1cce0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1ccf0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1cd00 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1cd10 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1cd20 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1cd30 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
1cd40 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
1cd50 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1cd60 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
1cd70 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
1cd80 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
1cd90 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
1cda0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
1cdb0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1cdc0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1cdd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1cde0 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
1cdf0 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   u32 nLocal;..  
1ce00 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
1ce10 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
1ce20 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1ce30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1ce40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ce50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ce60 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1ce70 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1ce80 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
1ce90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1cea0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1ceb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1cec0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1ced0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1cee0 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
1cef0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1cf00 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1cf10 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
1cf20 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
1cf30 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
1cf40 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1cf50 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
1cf60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
1cf70 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
1cf80 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1cf90 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
1cfa0 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
1cfb0 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
1cfc0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1cfd0 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
1cfe0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
1cff0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1d000 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
1d010 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
1d020 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
1d030 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
1d040 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1d050 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1d060 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1d070 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1d080 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1d090 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1d0a0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1d0b0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1d0c0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1d0d0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1d0e0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1d0f0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1d100 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1d110 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1d120 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1d130 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1d140 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1d150 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1d160 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1d170 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1d180 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
1d190 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
1d1a0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
1d1b0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
1d1c0 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
1d1d0 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
1d1e0 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
1d1f0 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
1d200 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
1d210 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
1d220 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1d230 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1d240 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
1d250 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
1d260 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
1d270 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1d280 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
1d290 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
1d2a0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
1d2b0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
1d2c0 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
1d2d0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1d2e0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  t){.  assert( cu
1d2f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d300 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
1d310 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d320 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1d330 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
1d340 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
1d350 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
1d360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1d370 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
1d380 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
1d390 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
1d3a0 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
1d3b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d3c0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d3d0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
1d3e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d3f0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
1d400 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
1d410 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1d420 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
1d430 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1d440 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1d450 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1d460 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
1d470 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
1d480 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
1d490 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
1d4a0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
1d4b0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73  to move to..*/.s
1d4c0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1d4d0 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
1d4e0 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
1d4f0 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
1d500 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
1d510 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
1d520 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
1d530 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1d540 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
1d550 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1d560 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1d570 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1d580 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1d590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1d5a0 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
1d5b0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
1d5c0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1d5d0 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
1d5e0 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
1d5f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d600 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1d610 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
1d620 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
1d630 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b  gno, &pNewPage);
1d640 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1d650 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
1d660 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
1d670 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
1d680 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
1d690 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
1d6a0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1d6b0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1d6c0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1d6d0 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
1d6e0 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72  nCell<1 ){.    r
1d6f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d700 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1d710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d720 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  K;.}..#ifndef ND
1d730 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
1d740 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
1d750 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
1d760 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
1d770 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
1d780 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
1d790 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
1d7a0 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
1d7b0 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
1d7c0 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
1d7d0 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
1d7e0 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
1d7f0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1d800 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
1d810 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
1d820 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
1d830 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
1d840 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
1d850 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
1d860 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
1d870 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
1d880 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
1d890 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
1d8a0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
1d8b0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
1d8c0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
1d8d0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
1d8e0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1d8f0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
1d900 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
1d910 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
1d920 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
1d930 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1d940 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1d950 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
1d960 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
1d970 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
1d980 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1d990 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
1d9a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1d9b0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
1d9c0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
1d9d0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
1d9e0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
1d9f0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
1da00 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
1da10 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
1da20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1da30 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
1da40 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
1da50 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
1da60 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
1da70 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1da80 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
1da90 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
1daa0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  ll index..*/.voi
1dab0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  d sqlite3BtreeMo
1dac0 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
1dad0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
1dae0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1daf0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1db00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1db10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1db20 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1db30 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
1db40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1db50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1db60 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
1db70 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
1db80 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
1db90 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
1dba0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
1dbb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
1dbc0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
1dbd0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1dbe0 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c  >pgno.  );.  rel
1dbf0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1dc00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1dc10 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  e]);.  pCur->iPa
1dc20 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ge--;.  pCur->in
1dc30 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1dc40 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1dc50 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  = 0;.}../*.** Mo
1dc60 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1dc70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a   the root page.*
1dc80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1dc90 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
1dca0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
1dcb0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
1dcc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dcd0 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
1dce0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
1dcf0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1dd00 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
1dd10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1dd20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1dd30 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
1dd40 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
1dd50 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
1dd60 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
1dd70 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
1dd80 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
1dd90 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
1dda0 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
1ddb0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1ddc0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1ddd0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
1dde0 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
1ddf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1de00 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
1de10 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
1de20 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20  >skip;.    }.   
1de30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1de40 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1de50 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
1de60 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
1de70 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1de80 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=1; i<=pCur->iP
1de90 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1dea0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1deb0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1dec0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1ded0 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
1dee0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
1def0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1df00 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
1df10 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
1df20 30 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  0])).    ){.    
1df30 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1df40 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1df50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1df60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
1df70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
1df80 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
1df90 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
1dfa0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
1dfb0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
1dfc0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64   0;.  pCur->aiId
1dfd0 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
1dfe0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1dff0 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  ;.  pCur->atLast
1e000 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1e010 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
1e020 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
1e030 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c  ==0 && !pRoot->l
1e040 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1e050 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73  subpage;.    ass
1e060 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
1e070 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61  ==1 );.    subpa
1e080 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
1e090 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
1e0a0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
1e0b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75  ;.    assert( su
1e0c0 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70  bpage>0 );.    p
1e0d0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1e0e0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
1e0f0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1e100 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
1e110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
1e120 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
1e130 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Root->nCell>0)?C
1e140 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
1e150 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d  OR_INVALID);.  }
1e160 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e170 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1e180 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1e190 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1e1a0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1e1b0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
1e1c0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1e1d0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
1e1e0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
1e1f0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
1e200 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
1e210 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
1e220 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
1e230 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1e240 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1e250 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
1e260 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1e270 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1e280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e290 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1e2a0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1e2b0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1e2c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1e2d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e2e0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1e2f0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1e300 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
1e310 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1e320 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
1e330 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1e340 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1e350 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1e360 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
1e370 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
1e380 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1e390 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1e3a0 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
1e3b0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1e3c0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1e3d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e3e0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1e3f0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1e400 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
1e410 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1e420 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
1e430 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1e440 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
1e450 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
1e460 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
1e470 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1e480 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
1e490 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
1e4a0 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
1e4b0 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
1e4c0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1e4d0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
1e4e0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
1e4f0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1e500 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1e510 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1e520 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
1e530 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1e540 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
1e550 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
1e560 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
1e570 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
1e580 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1e590 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
1e5a0 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
1e5b0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1e5c0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1e5d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1e5e0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1e5f0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1e600 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e610 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1e620 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e630 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e640 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1e650 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1e660 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1e670 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
1e680 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1e690 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1e6a0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1e6b0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1e6c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1e6d0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
1e6e0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
1e6f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1e700 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1e710 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
1e730 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1e740 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
1e750 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
1e760 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1e770 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1e780 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
1e790 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e7a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1e7b0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1e7c0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1e7d0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1e7e0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1e7f0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1e800 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1e810 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1e820 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1e830 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1e840 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1e850 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1e860 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
1e870 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1e880 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1e890 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1e8a0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1e8b0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1e8c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e8d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1e8e0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1e8f0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
1e900 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1e910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e920 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1e930 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e940 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1e950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1e960 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1e970 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
1e980 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1e990 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
1e9a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e9b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1e9c0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1e9d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1e9e0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
1e9f0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1ea00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1ea10 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1ea20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1ea30 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1ea40 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1ea50 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1ea60 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1ea70 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
1ea80 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
1ea90 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
1eaa0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
1eab0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
1eac0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
1ead0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
1eae0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1eaf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1eb00 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
1eb10 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1eb20 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1eb30 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1eb40 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1eb50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1eb60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1eb70 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1eb80 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
1eb90 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
1eba0 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
1ebb0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
1ebc0 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
1ebd0 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
1ebe0 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
1ebf0 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72  ->eState && pCur
1ec00 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64  ->atLast ){.#ifd
1ec10 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ec20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
1ec30 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
1ec40 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
1ec50 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
1ec60 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
1ec70 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1ec80 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
1ec90 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
1eca0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1ecb0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
1ecc0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
1ecd0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
1ece0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
1ecf0 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
1ed00 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1ed10 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1ed20 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
1ed30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ed40 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
1ed50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1ed60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1ed70 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
1ed80 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
1ed90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1eda0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1edb0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1edc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1edd0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
1ede0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1edf0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
1ee00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1ee10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1ee20 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1ee30 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1ee40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ee50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1ee60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1ee70 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
1ee80 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
1ee90 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1eea0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
1eeb0 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63  Cur->atLast = rc
1eec0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30  ==SQLITE_OK ?1:0
1eed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1eee0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1eef0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
1ef00 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
1ef10 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
1ef20 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
1ef30 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
1ef40 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
1ef50 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
1ef60 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
1ef70 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
1ef80 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
1ef90 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
1efa0 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
1efb0 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
1efc0 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
1efd0 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
1efe0 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
1eff0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
1f000 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
1f010 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
1f020 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
1f030 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
1f040 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
1f050 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
1f060 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
1f070 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
1f080 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
1f090 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
1f0a0 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
1f0b0 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
1f0c0 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
1f0d0 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
1f0e0 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
1f0f0 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
1f100 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
1f110 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
1f120 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
1f130 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
1f140 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
1f150 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
1f160 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
1f170 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
1f180 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
1f190 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1f1a0 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
1f1b0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1f1c0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1f1d0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1f1e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1f1f0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
1f200 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
1f210 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
1f220 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1f240 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
1f250 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
1f260 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
1f270 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
1f280 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
1f290 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
1f2a0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1f2b0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1f2c0 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
1f2d0 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
1f2e0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
1f2f0 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
1f300 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1f310 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1f320 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
1f350 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
1f360 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
1f370 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1f380 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
1f390 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
1f3a0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1f3b0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
1f3c0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1f3d0 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
1f3e0 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
1f3f0 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f410 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
1f420 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
1f430 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1f440 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
1f450 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
1f460 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1f470 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1f480 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1f490 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
1f4a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1f4b0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1f4c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1f4d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1f4e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1f4f0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1f500 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1f510 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1f520 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
1f530 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
1f540 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
1f550 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
1f560 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
1f570 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
1f580 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
1f590 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
1f5a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f5b0 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c  LID && pCur->val
1f5c0 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43  idNKey .   && pC
1f5d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
1f5e0 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20  ntKey .  ){.    
1f5f0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1f600 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
1f610 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1f620 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f630 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1f640 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61    if( pCur->atLa
1f650 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  st && pCur->info
1f660 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
1f670 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
1f680 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1f690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1f6a0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
1f6b0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1f6c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1f6d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1f6e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1f6f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f700 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f710 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1f720 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20  >iPage]->isInit 
1f730 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1f740 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1f750 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
1f760 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
1f770 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1f780 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1f790 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1f7a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f7b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1f7c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
1f7d0 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  >intKey || pIdxK
1f7e0 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
1f7f0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
1f800 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  r;.    Pgno chld
1f810 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
1f820 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
1f830 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1f840 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  e];.    int c = 
1f850 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1f860 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1f870 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1f880 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1f890 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1f8a0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1f8b0 66 28 20 28 21 70 50 61 67 65 2d 3e 69 6e 74 4b  f( (!pPage->intK
1f8c0 65 79 20 26 26 20 70 49 64 78 4b 65 79 3d 3d 30  ey && pIdxKey==0
1f8d0 29 20 7c 7c 20 75 70 72 3c 30 20 29 7b 0a 20 20  ) || upr<0 ){.  
1f8e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f8f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f900 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1f910 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
1f920 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
1f930 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  ){.      pCur->a
1f940 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1f950 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20  ] = (u16)upr;.  
1f960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f970 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f980 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
1f990 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20  (upr+lwr)/2);.  
1f9a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b    }.    for(;;){
1f9b0 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d  .      int idx =
1f9c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1f9d0 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e  r->iPage]; /* In
1f9e0 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63  dex of current c
1f9f0 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
1fa00 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1fa30 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
1fa40 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
1fa50 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ..      pCur->in
1fa60 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1fa70 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
1fa80 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
1fa90 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
1faa0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  trSize;.      if
1fab0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
1fac0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
1fad0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
1fae0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
1faf0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
1fb00 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
1fb10 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
1fb20 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
1fb30 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
1fb40 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
1fb50 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
1fb60 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
1fb70 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
1fb80 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
1fb90 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
1fba0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1fbb0 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
1fbc0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1fbd0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1fbe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fbf0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
1fc00 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  >intKey );.     
1fc10 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
1fc20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1fc30 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1fc40 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
1fc50 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
1fc60 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  ellKey;.      }e
1fc70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1fc80 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
1fc90 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
1fca0 69 73 20 33 32 37 36 38 20 62 79 74 65 73 2e 20  is 32768 bytes. 
1fcb0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
1fcc0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
1fcd0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
1fce0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
1fcf0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
1fd00 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
1fd10 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20 6d 6f  ** page is at mo
1fd20 73 74 20 38 31 39 38 20 62 79 74 65 73 2c 20 77  st 8198 bytes, w
1fd30 68 69 63 68 20 6d 61 79 20 62 65 20 73 74 6f 72  hich may be stor
1fd40 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
1fd50 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
1fd60 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
1fd70 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
1fd80 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
1fd90 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
1fda0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
1fdb0 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
1fdc0 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
1fdd0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
1fde0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
1fdf0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
1fe00 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
1fe10 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
1fe20 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
1fe30 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
1fe40 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
1fe50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1fe60 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c  int nCell = pCel
1fe70 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
1fe80 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30  ( !(nCell & 0x80
1fe90 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67  ) && nCell<=pPag
1fea0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
1feb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
1fec0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
1fed0 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
1fee0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
1fef0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
1ff00 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
1ff10 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
1ff20 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
1ff30 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
1ff40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
1ff50 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
1ff60 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
1ff70 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1ff80 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
1ff90 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
1ffa0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
1ffb0 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
1ffc0 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
1ffd0 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
1ffe0 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
1fff0 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
20000 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
20010 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
20020 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
20030 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
20040 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
20050 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
20060 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
20070 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
20080 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
20090 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
200a0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
200b0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
200c0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
200d0 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
200e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
200f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
20100 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
20110 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
20120 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
20130 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
20140 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
20150 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
20160 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
20170 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
20180 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
20190 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
201a0 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
201b0 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
201c0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
201d0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
201e0 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
201f0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
20200 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
20210 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
20220 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
20230 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
20240 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
20250 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
20260 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
20270 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
20280 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
20290 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
202a0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
202b0 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 75       nCell = pCu
202c0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
202d0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
202e0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
202f0 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ( nCell );.     
20300 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
20310 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
20320 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20330 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
20340 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
20350 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
20360 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
20370 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
20380 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
20390 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
203a0 70 43 65 6c 6c 4b 65 79 2c 20 30 2c 20 30 29 3b  pCellKey, 0, 0);
203b0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
203c0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
203d0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
203e0 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
203f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
20400 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
20410 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
20420 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
20430 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
20440 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20450 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
20460 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
20470 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
20480 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
20490 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
204a0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  ;.          upr 
204b0 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20  = lwr - 1;.     
204c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
204d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
204e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
204f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
20500 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
20510 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
20520 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
20530 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
20540 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
20550 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
20560 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20570 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
20580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20590 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20  if( lwr>upr ){. 
205a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
205b0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
205c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
205d0 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 6c 77  age] = (u16)((lw
205e0 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+upr)/2);.    }
205f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
20600 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61  ==upr+1 );.    a
20610 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
20620 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
20630 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
20640 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b       chldPg = 0;
20650 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
20660 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
20670 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
20680 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
20690 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
206a0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
206b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
206c0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
206d0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
206e0 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
206f0 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d      if( chldPg==
20700 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
20710 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
20720 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
20730 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
20740 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
20750 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
20760 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
20770 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
20780 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
20790 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
207a0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
207b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
207c0 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70   (u16)lwr;.    p
207d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
207e0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
207f0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
20800 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
20810 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
20820 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
20830 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
20840 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  h;.  }.moveto_fi
20850 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72  nish:.  return r
20860 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  c;.}../*.** In t
20870 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
20880 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
20890 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
208a0 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
208b0 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
208c0 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
208d0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
208e0 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
208f0 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
20900 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
20910 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
20920 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20  he work..*/.int 
20930 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
20940 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
20950 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
20960 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
20970 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
20980 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
20990 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
209a0 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
209b0 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
209c0 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
209d0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
209e0 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
209f0 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
20a00 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
20a10 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
20a20 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
20a30 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
20a40 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
20a50 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
20a60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
20a70 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
20a80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
20ab0 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
20ac0 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
20ad0 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
20ae0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68  ndex key */.  ch
20af0 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d 3b 20  ar aSpace[150]; 
20b00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
20b10 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b   space for pIdxK
20b20 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ey - to avoid a 
20b30 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 0a 20 20 69 66  malloc */...  if
20b40 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
20b50 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
20b60 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
20b70 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
20b80 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
20b90 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
20ba0 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
20bb0 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bd0 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61 63             aSpac
20be0 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65  e, sizeof(aSpace
20bf0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  ));.    if( pIdx
20c00 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
20c10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
20c20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
20c30 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
20c40 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
20c50 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
20c60 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
20c70 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
20c80 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
20c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
20ca0 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
20cb0 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a  d(pIdxKey);.  }.
20cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20cd0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
20ce0 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
20cf0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
20d00 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
20d10 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
20d20 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
20d30 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
20d40 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
20d50 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
20d60 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
20d70 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
20d80 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
20d90 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
20da0 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
20db0 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
20dc0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
20dd0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
20de0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
20df0 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
20e00 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
20e10 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
20e20 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
20e30 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
20e40 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
20e50 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
20e60 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
20e70 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
20e80 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
20e90 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
20ea0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
20eb0 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
20ec0 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
20ed0 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
20ee0 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
20ef0 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
20f00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20f10 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
20f20 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f  ection handle fo
20f30 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  r a cursor..*/.s
20f40 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42  qlite3 *sqlite3B
20f50 74 72 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e  treeCursorDb(con
20f60 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st BtCursor *pCu
20f70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  r){.  assert( sq
20f80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
20f90 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
20fa0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
20fb0 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72  eturn pCur->pBtr
20fc0 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee->db;.}../*.**
20fd0 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
20fe0 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
20ff0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
21000 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
21010 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
21020 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
21030 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
21040 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
21050 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
21060 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
21070 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
21080 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
21090 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
210a0 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
210b0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
210c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
210d0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
210e0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
210f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21100 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
21110 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21120 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
21130 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
21140 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
21150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21160 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
21170 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
21180 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66   pRes!=0 );.  if
21190 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
211a0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
211b0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
211c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
211d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
211e0 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b   pCur->skip>0 ){
211f0 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
21200 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
21210 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
21220 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21230 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
21240 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
21250 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21260 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
21270 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21280 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
21290 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
212a0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t );.  assert( i
212b0 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx<=pPage->nCell
212c0 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66   );..  pCur->inf
212d0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
212e0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
212f0 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70   0;.  if( idx>=p
21300 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
21310 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
21320 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
21330 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
21340 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
21350 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
21360 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
21370 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
21380 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21390 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
213a0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
213b0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
213c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
213d0 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
213e0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
213f0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
21400 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
21410 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
21420 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
21430 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
21440 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
21450 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
21460 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
21470 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
21480 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
21490 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
214a0 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
214b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
214c0 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
214d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
214e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
214f0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
21500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21510 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
21520 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
21530 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
21540 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21550 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
21560 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
21570 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
21580 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
21590 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
215a0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65  .  rc = moveToLe
215b0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
215c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
215d0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
215e0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
215f0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
21600 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
21610 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
21620 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
21630 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
21640 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
21650 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
21660 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
21670 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
21680 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
21690 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
216a0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
216b0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
216c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
216d0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
216e0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
216f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
21700 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
21710 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21720 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21730 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
21740 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
21750 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
21760 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21770 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21780 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  }.  pCur->atLast
21790 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53   = 0;.  if( CURS
217a0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
217b0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
217c0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
217d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
217e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
217f0 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70  >skip<0 ){.    p
21800 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
21810 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
21820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21830 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
21840 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
21850 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
21860 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
21870 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
21880 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
21890 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
218a0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
218b0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
218c0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
218d0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
218e0 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
218f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
21900 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
21910 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
21920 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
21930 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
21940 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
21950 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
21960 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21970 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
21980 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
21990 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
219a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
219b0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
219c0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
219d0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
219e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
219f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
21a00 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
21a10 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
21a20 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
21a30 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
21a40 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
21a50 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   0;..    pCur->a
21a60 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
21a70 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
21a80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21a90 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
21aa0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
21ab0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
21ac0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
21ad0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
21ae0 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
21af0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21b00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21b10 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
21b20 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
21b30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21b40 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
21b50 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
21b60 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
21b70 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
21b80 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
21b90 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
21ba0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
21bb0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
21bc0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
21bd0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
21be0 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
21bf0 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
21c00 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
21c10 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
21c20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
21c30 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
21c40 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
21c50 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
21c60 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
21c70 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
21c80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
21c90 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
21ca0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
21cb0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
21cc0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
21cd0 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
21ce0 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
21cf0 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
21d00 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
21d10 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
21d20 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
21d30 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
21d40 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
21d50 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
21d60 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
21d70 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
21d80 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
21d90 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
21da0 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
21db0 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
21dc0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
21dd0 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
21de0 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
21df0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
21e00 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
21e10 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
21e20 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
21e30 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
21e40 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
21e50 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
21e60 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
21e70 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
21e80 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
21e90 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
21ea0 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
21eb0 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
21ec0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
21ed0 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
21ee0 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
21ef0 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
21f00 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
21f10 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
21f20 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
21f30 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
21f40 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
21f50 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
21f60 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
21f70 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
21f80 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
21f90 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
21fa0 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
21fb0 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
21fc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
21fd0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
21fe0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
21ff0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
22000 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
22010 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt k;     /* Num
22020 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
22030 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
22040 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
22050 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
22060 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
22070 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
22080 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22090 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
220a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
220b0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
220c0 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  ge1;.  n = get4b
220d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
220e0 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
220f0 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
22100 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
22110 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
22120 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
22130 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
22140 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
22150 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
22160 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
22170 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
22180 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
22190 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
221a0 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
221b0 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
221c0 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
221d0 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
221e0 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
221f0 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
22200 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
22210 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
22220 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
22230 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
22240 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
22250 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
22260 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
22270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22280 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
22290 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
222a0 62 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  by<=pagerPagecou
222b0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
222c0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
222d0 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
222e0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
222f0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
22300 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  um );.      rc =
22310 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
22320 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
22330 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
22340 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
22350 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
22360 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
22370 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  {.        search
22380 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
22390 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  }.      *pPgno =
223a0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23   nearby;.    }.#
223b0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
223c0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
223d0 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
223e0 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
223f0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
22400 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
22410 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
22420 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
22430 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
22440 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
22450 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
22460 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
22470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
22480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
22490 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
224a0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
224b0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
224c0 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
224d0 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
224e0 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
224f0 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
22500 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
22510 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
22520 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
22530 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
22540 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
22550 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
22560 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
22570 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20  ' is located..  
22580 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
22590 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
225a0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
225b0 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
225c0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
225d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
225e0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
225f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22600 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
22610 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
22620 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
22630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
22640 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
22650 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
22660 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
22670 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
22680 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
22690 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
226a0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
226b0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
226c0 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
226d0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
226e0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
226f0 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
22700 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
22710 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
22720 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
22730 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
22740 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
22750 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
22760 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
22770 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
22780 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
22790 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
227a0 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
227b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
227c0 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
227d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
227e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
227f0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
22800 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
22810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
22820 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
22830 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
22840 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
22850 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
22860 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
22870 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
22880 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
22890 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
228a0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
228b0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
228c0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
228d0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
228e0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
228f0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
22900 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
22910 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74   }else if( k>pBt
22920 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
22930 20 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   2 ){.        /*
22940 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
22950 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
22960 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
22970 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
22980 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
22990 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
229a0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
229b0 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
229c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
229d0 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
229e0 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
229f0 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
22a00 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
22a10 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
22a20 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
22a30 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
22a40 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
22a50 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
22a60 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
22a70 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
22a80 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
22a90 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
22aa0 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
22ab0 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
22ac0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
22ad0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
22ae0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
22af0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22b00 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
22b10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
22b20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
22b30 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
22b40 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
22b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22b60 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
22b70 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
22b80 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
22b90 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
22ba0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
22bb0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
22bc0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
22bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22be0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
22bf0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
22c00 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
22c10 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
22c20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
22c30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
22c40 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
22c50 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
22c60 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
22c70 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
22c80 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
22c90 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
22ca0 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
22cb0 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
22cc0 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
22cd0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
22ce0 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
22cf0 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
22d00 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
22d10 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
22d20 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
22d30 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
22d40 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
22d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
22d60 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
22d70 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
22d80 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
22d90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22da0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22db0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
22dc0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
22dd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22de0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22df0 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
22e00 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
22e10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
22e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22e30 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
22e40 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
22e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
22e60 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
22e70 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
22e80 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
22e90 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
22ea0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
22eb0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
22ec0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
22ed0 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
22ee0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
22ef0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
22f00 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
22f10 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
22f20 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
22f30 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
22f40 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
22f50 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
22f60 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
22f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
22f80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
22f90 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
22fa0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
22fb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
22fc0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
22fd0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
22fe0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
22ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23000 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23010 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
23020 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
23030 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23040 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
23050 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
23060 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
23070 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23080 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
23090 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
230a0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
230b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
230c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
230d0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
230e0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
230f0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
23100 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
23110 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
23120 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
23130 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23140 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
23150 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
23160 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
23170 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20   int closest;.  
23180 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
23190 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
231a0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
231b0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
231c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
231d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
231e0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
231f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
23200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
23210 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
23220 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
23230 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
23240 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
23250 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20   int i, dist;.  
23260 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
23270 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
23280 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
23290 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
232a0 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  by;.          if
232b0 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20  ( dist<0 ) dist 
232c0 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20  = -dist;.       
232d0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
232e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
232f0 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34     int d2 = get4
23300 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
23310 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  4]) - nearby;.  
23320 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
23330 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20  <0 ) d2 = -d2;. 
23340 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
23350 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
23360 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
23370 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
23380 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
23390 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
233a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
233b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
233c0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
233d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
233e0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
233f0 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
23400 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
23410 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
23420 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
23430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
23440 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
23450 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67         Pgno nPag
23460 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  e;.          *pP
23470 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
23480 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70         nPage = p
23490 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
234a0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
234b0 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29  ( *pPgno>nPage )
234c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
234d0 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74   Free page off t
234e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
234f0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
23500 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
23510 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
23520 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
23530 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
23540 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23550 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
23560 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
23570 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
23580 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
23590 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
235a0 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
235b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
235c0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
235d0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
235e0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
235f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
23600 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
23610 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
23620 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
23630 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
23640 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
23650 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
23660 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
23670 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
23680 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23690 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
236a0 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  le(pTrunk->pDbPa
236b0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
236c0 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
236d0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
236e0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20  (pBt, *pPgno);. 
236f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
23700 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
23710 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
23720 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
23730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23750 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
23760 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23770 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
23780 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
23790 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
237a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
237b0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
237c0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
237d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
237e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
237f0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
23800 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
23810 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
23820 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
23830 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
23840 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
23850 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
23860 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
23870 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
23880 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
23890 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74  eelist, so creat
238a0 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20  e a new page at 
238b0 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  the.    ** end o
238c0 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
238d0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61    int nPage = pa
238e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
238f0 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
23900 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20  nPage + 1;..    
23910 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44  if( *pPgno==PEND
23920 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
23930 74 29 20 29 7b 0a 20 20 20 20 20 20 28 2a 70 50  t) ){.      (*pP
23940 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23  gno)++;.    }..#
23950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23960 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
23970 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
23980 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
23990 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67  ISPAGE(pBt, *pPg
239a0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  no) ){.      /* 
239b0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
239c0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
239d0 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
239e0 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
239f0 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
23a00 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
23a10 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
23a20 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
23a30 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
23a40 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
23a50 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
23a60 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
23a70 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
23a80 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
23a90 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
23aa0 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
23ab0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
23ac0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
23ad0 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
23ae0 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  e)\n", *pPgno));
23af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
23b00 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
23b10 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
23b20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23b30 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
23b40 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50  pBt, *pPgno, &pP
23b50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
23b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23b70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
23b80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
23b90 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
23ba0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
23bb0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
23bc0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
23bd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
23be0 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
23bf0 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
23c00 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
23c10 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e  E(pBt) ){ (*pPgn
23c20 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  o)++; }.    }.#e
23c30 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
23c40 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
23c50 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
23c60 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
23c70 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
23c80 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
23c90 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
23ca0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
23cb0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
23cc0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
23cd0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
23ce0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
23cf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23d00 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
23d10 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
23d20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
23d30 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
23d40 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
23d50 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
23d60 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
23d70 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
23d80 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
23d90 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
23da0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
23db0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
23dc0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66  PrevTrunk);.  if
23dd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23de0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
23df0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
23e00 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
23e10 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
23e20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
23e30 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  ppPage);.      r
23e40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
23e50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
23e60 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
23e70 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
23e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23e90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
23ea0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
23eb0 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
23ec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23ed0 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
23ee0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
23ef0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
23f00 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
23f10 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
23f20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
23f30 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
23f40 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
23f50 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
23f60 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
23f70 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
23f80 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
23f90 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
23fa0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
23fb0 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
23fc0 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
23fd0 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
23fe0 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
23ff0 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
24000 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
24010 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
24020 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
24030 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
24040 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
24050 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
24060 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
24070 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
24080 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
24090 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
240a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
240b0 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
240c0 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
240d0 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
240e0 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
240f0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
24100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24110 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
24120 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
24130 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24150 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
24160 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
24170 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
24180 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
24190 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
241a0 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
241b0 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
241c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
241f0 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
24200 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
24210 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
24220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24230 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
24240 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
24250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24260 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
24270 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
24280 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
24290 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
242a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
242b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
242c0 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
242d0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
242e0 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
242f0 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
24300 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
24310 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
24320 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
24330 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
24340 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
24350 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24360 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
24370 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
24380 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
24390 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
243a0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
243b0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
243c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
243d0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
243e0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
243f0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
24400 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
24410 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
24420 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
24430 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
24440 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
24450 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  1);..#ifdef SQLI
24460 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
24470 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
24480 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
24490 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
244a0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
244b0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61  , then.  ** alwa
244c0 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
244d0 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
244e0 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
244f0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21  s..  */.  if( (!
24500 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20 73  pPage && (rc = s
24510 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
24520 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
24530 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c  pPage, 0))).   |
24540 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 72 63  |            (rc
24550 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
24560 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
24570 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67  age)).  ){.    g
24580 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
24590 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
245a0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
245b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
245c0 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Size);.#endif.. 
245d0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
245e0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
245f0 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
24600 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
24610 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
24620 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
24630 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
24640 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
24650 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
24660 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
24670 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
24680 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
24690 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
246a0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
246b0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
246c0 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
246d0 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
246e0 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
246f0 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
24700 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
24710 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
24720 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
24730 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
24740 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
24750 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
24760 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
24770 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
24780 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
24790 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
247a0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
247b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
247c0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
247d0 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
247e0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
247f0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
24800 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
24810 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
24820 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
24830 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
24840 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
24850 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
24860 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
24870 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 3b  {.    int nLeaf;
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24890 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
248a0 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
248b0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
248c0 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
248d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
248e0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
248f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
24900 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
24910 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
24920 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
24930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24940 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
24950 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
24960 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
24970 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
24980 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  [4]);.    if( nL
24990 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  eaf<0 ){.      r
249a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
249b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
249c0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
249d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
249e0 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c  nLeaf<pBt->usabl
249f0 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
24a00 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
24a10 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
24a20 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
24a30 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
24a40 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
24a50 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
24a60 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
24a70 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
24a80 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
24a90 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
24aa0 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
24ab0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
24ac0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
24ad0 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
24ae0 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
24af0 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
24b00 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
24b10 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
24b20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
24b30 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
24b40 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
24b50 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
24b60 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
24b70 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
24b80 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
24b90 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
24ba0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
24bb0 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
24bc0 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
24bd0 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
24be0 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
24bf0 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
24c00 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
24c10 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
24c20 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
24c30 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
24c40 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74  tain to restrict
24c50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
24c60 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
24c70 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
24c80 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
24c90 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
24ca0 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
24cb0 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
24cc0 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
24cd0 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
24ce0 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
24cf0 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
24d00 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
24d10 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
24d20 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
24d30 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
24d40 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
24d50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
24d60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24d70 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
24d80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
24d90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24da0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
24db0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
24dc0 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
24dd0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
24de0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
24df0 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
24e00 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  age);.#ifndef SQ
24e10 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
24e20 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  TE.        if( p
24e30 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
24e40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
24e50 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
24e60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
24e70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
24e80 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
24e90 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
24ea0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
24eb0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
24ec0 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
24ed0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
24ee0 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
24ef0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
24f00 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
24f10 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
24f20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
24f30 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
24f40 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
24f50 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
24f60 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
24f70 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
24f80 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
24f90 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
24fa0 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
24fb0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
24fc0 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
24fd0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
24fe0 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
24ff0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
25000 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
25010 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
25020 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
25030 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
25040 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
25050 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
25060 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
25070 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
25080 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
25090 20 69 66 28 20 20 20 28 28 21 70 50 61 67 65 29   if(   ((!pPage)
250a0 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20   && (0 != (rc = 
250b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
250c0 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
250d0 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a 20 20  &pPage, 0)))).  
250e0 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
250f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
25100 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
25110 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 67  ge))).  ){.    g
25120 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
25130 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
25140 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
25150 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
25160 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
25170 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
25180 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
25190 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
251a0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
251b0 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
251c0 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
251d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
251e0 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
251f0 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
25200 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
25210 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
25220 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
25230 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
25240 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
25250 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
25260 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
25270 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
25280 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
25290 6e 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  n freePage2(pPag
252a0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
252b0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a  Page->pgno);.}..
252c0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
252d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
252e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
252f0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
25300 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
25310 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
25320 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
25330 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
25340 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
25350 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
25360 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
25370 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
25380 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
25390 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50 61  fl;.  u16 ovflPa
253a0 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
253b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
253c0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
253d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
253e0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
253f0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
25400 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
25410 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
25420 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
25430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
25440 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
25450 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
25460 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
25470 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
25480 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
25490 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
254a0 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72  rflow]);.  asser
254b0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
254c0 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
254d0 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
254e0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
254f0 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
25500 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
25510 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
25520 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
25530 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
25540 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
25550 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
25560 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
25570 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
25580 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
25590 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
255a0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
255b0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65  || ovflPgno>page
255c0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
255d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
255e0 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
255f0 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
25600 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
25610 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
25620 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
25630 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
25640 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
25650 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
25660 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
25670 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
25680 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
25690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
256a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
256b0 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
256c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
256d0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
256e0 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
256f0 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
25700 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
25710 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
25720 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
25730 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
25740 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  Pgno);.    if( p
25750 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
25760 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
25770 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
25780 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
25790 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
257a0 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
257b0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
257c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
257d0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
257e0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
257f0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
25800 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
25810 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
25820 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
25830 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
25840 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
25850 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
25860 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
25870 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
25880 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
25890 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
258a0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
258b0 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
258c0 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
258d0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
258e0 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
258f0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
25900 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
25910 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
25920 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
25930 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
25940 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
25950 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
25960 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
25970 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
25980 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
25990 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
259a0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
259b0 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
259c0 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
259d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
259e0 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
259f0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
25a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25a10 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
25a20 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
25a30 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
25a40 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
25a50 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
25a60 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
25a70 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
25a80 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
25a90 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
25aa0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
25ab0 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
25ac0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
25ad0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
25b00 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
25b10 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
25b20 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b40 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
25b50 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
25b60 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
25b70 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
25b80 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
25b90 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
25ba0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
25bb0 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
25bc0 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
25bd0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
25be0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
25bf0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
25c00 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
25c10 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
25c20 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
25c30 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
25c40 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
25c50 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
25c60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25c70 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
25c80 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
25c90 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
25ca0 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
25cb0 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
25cc0 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
25cd0 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
25ce0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
25cf0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
25d00 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
25d10 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
25d20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
25d30 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
25d40 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
25d50 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
25d60 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
25d70 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
25d80 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
25d90 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
25da0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
25db0 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
25dc0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
25dd0 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
25de0 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
25df0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
25e00 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
25e10 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
25e20 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
25e30 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
25e40 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
25e50 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
25e60 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
25e70 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
25e80 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
25e90 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  nKey);.  sqlite3
25ea0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
25eb0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
25ec0 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
25ed0 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
25ee0 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
25ef0 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
25f00 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
25f10 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75  ( info.nData==(u
25f20 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  32)(nData+nZero)
25f30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
25f40 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
25f50 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
25f60 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
25f70 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
25f80 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
25f90 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
25fa0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
25fb0 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
25fc0 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3e  { .    if( nKey>
25fd0 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b  0x7fffffff || pK
25fe0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ey==0 ){.      r
25ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26000 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
26010 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74  nPayload += (int
26020 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
26030 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
26040 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
26050 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
26060 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
26070 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
26080 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
26090 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
260a0 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
260b0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
260c0 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
260d0 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
260e0 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
260f0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
26100 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
26110 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
26120 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
26130 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
26140 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
26150 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
26160 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
26170 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
26180 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
26190 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
261a0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
261b0 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
261c0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
261d0 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
261e0 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
261f0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
26200 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
26210 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
26220 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
26230 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
26240 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
26250 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
26260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26270 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
26280 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
26290 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
262a0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
262b0 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
262c0 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
262d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
262e0 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
262f0 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
26300 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
26310 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
26320 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
26330 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
26340 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
26350 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
26360 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
26370 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
26380 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
26390 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
263a0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
263b0 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
263c0 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
263d0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
263e0 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
263f0 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
26400 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
26410 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
26420 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
26430 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
26440 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
26450 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
26460 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
26470 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
26480 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
26490 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
264a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
264b0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
264c0 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
264d0 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
264e0 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
264f0 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OW1);.        rc
26500 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
26510 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
26520 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  e, pgnoPtrmap);.
26530 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
26540 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
26550 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
26560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26570 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
26580 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
26590 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
265a0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
265b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
265c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
265d0 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
265e0 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
265f0 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
26600 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
26610 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
26620 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
26630 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
26640 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
26650 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
26660 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
26670 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
26680 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
26690 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
266a0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
266b0 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
266c0 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
266d0 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
266e0 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
266f0 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
26700 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
26710 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
26720 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
26730 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
26740 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
26750 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
26760 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
26770 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
26780 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
26790 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
267a0 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
267b0 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
267c0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
267d0 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
267e0 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
267f0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
26800 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
26810 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
26820 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
26830 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
26840 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
26850 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
26860 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
26870 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
26880 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
26890 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
268a0 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
268b0 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
268c0 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
268d0 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
268e0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
268f0 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
26900 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
26910 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
26920 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
26930 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
26940 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
26950 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
26960 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
26970 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
26980 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
26990 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
269a0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
269b0 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
269c0 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
269d0 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
269e0 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
269f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
26a00 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
26a10 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
26a20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
26a30 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
26a40 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
26a50 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26a60 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
26a70 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
26a80 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
26a90 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
26aa0 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
26ab0 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
26ac0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
26ad0 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
26ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
26af0 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
26b00 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
26b10 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
26b20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
26b30 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
26b40 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
26b50 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
26b60 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
26b70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
26b80 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
26b90 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
26ba0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
26bb0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
26bc0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
26bd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26be0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
26bf0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
26c00 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
26c10 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
26c20 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
26c30 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
26c40 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
26c50 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
26c60 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
26c70 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
26c80 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
26c90 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
26ca0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
26cb0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
26cc0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
26cd0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
26ce0 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
26cf0 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
26d00 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
26d10 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
26d20 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  nt dropCell(MemP
26d30 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
26d40 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20  idx, int sz){.  
26d50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
26d60 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
26d70 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
26d80 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
26d90 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
26da0 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
26db0 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
26dc0 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
26dd0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
26de0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
26df0 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
26e00 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
26e10 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
26e20 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
26e30 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
26e40 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
26e50 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
26e60 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
26e70 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
26e80 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
26e90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
26ea0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
26eb0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
26ec0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
26ed0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
26ee0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
26ef0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
26f00 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
26f10 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61  a;.  ptr = &data
26f20 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
26f30 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70  et + 2*idx];.  p
26f40 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
26f50 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70 50 61  );.  if( (pc<pPa
26f60 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
26f70 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
26f80 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b 73  )).     || (pc+s
26f90 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  z>pPage->pBt->us
26fa0 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  ableSize) ){.   
26fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
26fc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
26fd0 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
26fe0 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
26ff0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
27000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
27010 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 6f  urn rc;.  }.  fo
27020 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
27030 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
27040 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
27050 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
27060 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
27070 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
27080 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
27090 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
270a0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
270b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
270c0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
270d0 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  2;.  return SQLI
270e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
270f0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
27100 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
27110 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
27120 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
27130 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
27140 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
27150 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
27160 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
27170 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
27180 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
27190 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
271a0 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
271b0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
271c0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
271d0 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
271e0 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
271f0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
27200 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
27210 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
27220 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61  pPage->aOvfl[] a
27230 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
27240 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
27250 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
27260 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
27270 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
27280 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
27290 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
272a0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
272b0 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
272c0 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
272d0 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
272e0 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
272f0 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
27300 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  If nSkip is non-
27310 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  zero, then do no
27320 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74  t copy the first
27330 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
27340 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  the.** cell. The
27350 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65   caller will ove
27360 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65  rwrite them afte
27370 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
27380 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e  returns. If.** n
27390 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
273a0 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79  , then pCell may
273b0 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
273c0 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   invalid memory 
273d0 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75  location .** (bu
273e0 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73  t pCell+nSkip is
273f0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a   always valid)..
27400 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
27410 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
27420 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
27430 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
27440 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
27450 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
27460 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
27470 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
27480 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
27490 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
274a0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
274b0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
274c0 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
274d0 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
274e0 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
274f0 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
27500 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
27510 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
27520 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
27530 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
27540 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20    u8 nSkip      
27550 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72      /* Do not wr
27560 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53  ite the first nS
27570 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
27580 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   cell */.){.  in
27590 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
275a0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
275b0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
275c0 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
275d0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
275e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
275f0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ter */.  int top
27600 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
27610 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74  rst byte of cont
27620 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c  ent for any cell
27630 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
27640 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
27650 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
27660 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
27670 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
27680 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
27690 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
276a0 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
276b0 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
276c0 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
276d0 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  d */.  int hdr; 
276e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
276f0 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f  et into data[] o
27700 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  f the page heade
27710 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  r */.  int cellO
27720 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
27730 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
27740 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
27750 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
27760 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
27770 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
27780 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
27790 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
277a0 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
277b0 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
277c0 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
277d0 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
277e0 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
277f0 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
27800 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
27810 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
27820 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
27830 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
27840 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
27850 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72  =5460 );.  asser
27860 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
27870 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
27880 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a  Page->aOvfl) );.
27890 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
278a0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
278b0 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
278c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
278d0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
278e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
278f0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
27900 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
27910 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
27920 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
27930 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
27940 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
27950 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
27960 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
27970 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  emp;.    }.    j
27980 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
27990 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
279a0 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
279b0 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f  f(pPage->aOvfl)/
279c0 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
279d0 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
279e0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
279f0 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
27a00 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
27a10 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b  j].idx = (u16)i;
27a20 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
27a30 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
27a40 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
27a50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
27a60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
27a70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
27a90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
27aa0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
27ab0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
27ac0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
27ad0 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
27ae0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
27af0 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
27b00 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
27b10 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
27b20 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
27b30 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
27b40 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
27b50 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
27b60 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
27b70 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20  ->nCell + 2;.   
27b80 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
27b90 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28  t + 2*i;.    if(
27ba0 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20   end > top - sz 
27bb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65  ){.      rc = de
27bc0 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
27bd0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
27be0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27bf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
27c00 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
27c10 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
27c20 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
27c30 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64       assert( end
27c40 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a   + sz <= top );.
27c50 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20      }.    idx = 
27c60 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
27c70 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73  age, sz);.    as
27c80 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20  sert( idx>0 );. 
27c90 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c     assert( end <
27ca0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
27cb0 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20  [hdr+5]) );.    
27cc0 69 66 20 28 69 64 78 2b 73 7a 20 3e 20 70 50 61  if (idx+sz > pPa
27cd0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
27ce0 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 72 65 74  ize) {.      ret
27cf0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27d00 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
27d10 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
27d20 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
27d30 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65  ree -= 2;.    me
27d40 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
27d50 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
27d60 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
27d70 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20     for(j=end-2, 
27d80 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
27d90 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
27da0 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
27db0 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
27dc0 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
27dd0 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
27de0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
27df0 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
27e00 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
27e10 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
27e20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
27e30 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
27e40 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
27e50 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
27e60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
27e70 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
27e80 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
27e90 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
27ea0 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
27eb0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
27ec0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
27ed0 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
27ee0 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
27ef0 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c     */.      Cell
27f00 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
27f10 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
27f20 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
27f30 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
27f40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69        assert( (i
27f50 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
27f60 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
27f70 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
27f80 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69  yload );.      i
27f90 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
27fa0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  w ){.        Pgn
27fb0 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
27fc0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
27fd0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
27fe0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
27ff0 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74  apPut(pPage->pBt
28000 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
28010 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
28020 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
28030 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28040 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28050 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
28060 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72  .#endif.  }..  r
28070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
28090 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f  list of cells to
280a0 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61   a page.  The pa
280b0 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  ge should be ini
280c0 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  tially empty..**
280d0 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67   The cells are g
280e0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74  uaranteed to fit
280f0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
28100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
28110 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d  emblePage(.  Mem
28120 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
28130 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
28140 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20   assemblied */. 
28150 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
28160 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
28170 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
28180 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
28190 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
281a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
281b0 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
281c0 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20  */.  u16 *aSize 
281d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
281e0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
281f0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
28200 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
28210 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
28220 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a  pCellptr;     /*
28230 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
28240 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
28250 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
28260 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
28270 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
28280 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  y */.  u8 * cons
28290 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
282a0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
282b0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
282c0 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20   data for pPage 
282d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  */.  const int h
282e0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
282f0 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
28300 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
28310 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ader on pPage */
28320 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73  .  const int nUs
28330 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  able = pPage->pB
28340 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  t->usableSize; /
28350 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
28360 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
28370 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
28380 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
28390 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
283a0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
283b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
283c0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30  assert( nCell>=0
283d0 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45   && nCell<=MX_CE
283e0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
283f0 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
28400 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20  >pBt)<=5460 );. 
28410 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28420 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28430 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
28440 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
28450 74 68 61 74 20 74 68 65 20 70 61 67 65 20 68 61  that the page ha
28460 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f  s just been zero
28470 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29  ed by zeroPage()
28480 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
28490 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
284a0 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62  .  assert( get2b
284b0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
284c0 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20  )==nUsable );.. 
284d0 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74   pCellptr = &dat
284e0 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
284f0 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a  set + nCell*2];.
28500 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73    cellbody = nUs
28510 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  able;.  for(i=nC
28520 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ell-1; i>=0; i--
28530 29 7b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  ){.    pCellptr 
28540 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f  -= 2;.    cellbo
28550 64 79 20 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  dy -= aSize[i];.
28560 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
28570 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29  llptr, cellbody)
28580 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
28590 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
285a0 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69  Cell[i], aSize[i
285b0 5d 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79  ]);.  }.  put2by
285c0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
285d0 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62   nCell);.  put2b
285e0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
285f0 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  , cellbody);.  p
28600 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
28610 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c  nCell*2 + nUsabl
28620 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  e - cellbody);. 
28630 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
28640 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  (u16)nCell;.}../
28650 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
28660 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
28670 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
28680 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
28690 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
286a0 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
286b0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
286c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
286d0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
286e0 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
286f0 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
28700 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
28710 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
28720 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
28730 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
28740 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
28750 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
28760 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
28770 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
28780 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
28790 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
287a0 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
287b0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
287c0 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
287d0 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
287e0 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
287f0 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
28800 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
28810 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
28820 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
28830 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
28840 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
28850 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
28860 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
28870 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
28880 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
28890 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
288a0 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
288b0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
288d0 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
288e0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
288f0 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
28900 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
28910 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
28920 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
28930 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
28940 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
28950 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
28960 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
28970 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29 3b 0a 0a  Cursor*, int);..
28980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28990 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
289a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
289b0 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
289c0 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
289d0 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
289e0 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
289f0 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
28a00 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
28a10 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
28a20 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
28a30 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
28a40 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
28a50 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
28a60 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
28a70 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
28a80 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
28a90 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63  of trying balanc
28aa0 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
28ab0 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
28ac0 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
28ad0 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
28ae0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
28af0 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
28b00 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
28b10 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
28b20 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
28b30 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
28b40 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
28b50 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
28b60 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
28b70 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
28b80 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
28b90 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
28ba0 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
28bb0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
28bc0 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
28bd0 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
28be0 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
28bf0 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
28c00 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
28c10 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
28c20 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
28c30 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
28c40 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
28c50 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
28c60 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
28c70 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
28c80 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
28c90 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
28ca0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
28cb0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
28cc0 6b 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  k(BtCursor *pCur
28cd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
28ce0 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30  emPage *pNew = 0
28cf0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  ;.  Pgno pgnoNew
28d00 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  ;.  u8 *pCell;. 
28d10 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43   u16 szCell;.  C
28d20 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
28d30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
28d40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28d50 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 4d 65  ur->iPage];.  Me
28d60 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d  mPage *pParent =
28d70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28d80 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
28d90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
28da0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
28db0 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50  t parentIdx = pP
28dc0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20  arent->nCell;   
28dd0 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64  /* pParent new d
28de0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65  ivider cell inde
28df0 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e  x */.  int paren
28e00 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
28e10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
28e20 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20   of new divider 
28e30 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72  cell */.  u8 par
28e40 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20  entCell[64];    
28e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
28e60 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
28e70 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
28e80 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
28e90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
28ea0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
28eb0 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ) );..  /* Alloc
28ec0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
28ed0 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66  Insert the overf
28ee0 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
28ef0 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74  age.  ** into it
28f00 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  . Then remove th
28f10 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
28f20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f  from pPage..  */
28f30 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
28f40 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
28f50 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
28f60 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
28f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28f80 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    pCell = pPage-
28f90 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
28fa0 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65  .    szCell = ce
28fb0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
28fc0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73   pCell);.    ass
28fd0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
28fe0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65  rIswriteable(pNe
28ff0 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  w->pDbPage) );. 
29000 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
29010 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
29020 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  ]);.    assemble
29030 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
29040 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
29050 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
29060 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a 20 20 20  flow = 0;.  .   
29070 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75 72   /* pPage is cur
29080 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74  rently the right
29090 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e  -child of pParen
290a0 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20  t. Change this. 
290b0 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68     ** so that th
290c0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73  e right-child is
290d0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c   the new page al
290e0 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e  located above an
290f0 64 0a 20 20 20 20 2a 2a 20 70 50 61 67 65 20 69  d.    ** pPage i
29100 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69  s the next-to-ri
29110 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 20 20  ght child. .    
29120 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e 6f 72 65  **.    ** Ignore
29130 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
29140 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  e of the call to
29150 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20 66   fillInCell(). f
29160 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20 20 20  illInCell().    
29170 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65 74 75  ** may only retu
29180 72 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  rn other than SQ
29190 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20 69 73  LITE_OK if it is
291a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 6c   required to all
291b0 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20 6f 6e 65  ocate.    ** one
291c0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
291d0 77 20 70 61 67 65 73 2e 20 53 69 6e 63 65 20 61  w pages. Since a
291e0 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61 62 6c 65  n internal table
291f0 20 42 2d 54 72 65 65 20 63 65 6c 6c 20 0a 20 20   B-Tree cell .  
29200 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65 72 20 73    ** may never s
29210 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f 20 61  pill over onto a
29220 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
29230 28 69 74 20 69 73 20 61 20 6d 61 78 69 6d 75 6d  (it is a maximum
29240 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31 33 20 62   of .    ** 13 b
29250 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c 20 69  ytes in size), i
29260 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65 73 73  t is not neccess
29270 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68 65  ary to check the
29280 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 20 20   return code..  
29290 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69    **.    ** Simi
292a0 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e 73 65 72  larly, the inser
292b0 74 43 65 6c 6c 28 29 20 66 75 6e 63 74 69 6f 6e  tCell() function
292c0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 66 20   cannot fail if 
292d0 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  the page.    ** 
292e0 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 69  being inserted i
292f0 6e 74 6f 20 69 73 20 61 6c 72 65 61 64 79 20 77  nto is already w
29300 72 69 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ritable and the 
29310 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 0a 20  cell does not . 
29320 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e     ** contain an
29330 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e 74 65   overflow pointe
29340 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 69  r. So ignore thi
29350 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  s return code to
29360 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  o..    */.    as
29370 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
29380 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70 43 65 6c  ll>0 );.    pCel
29390 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
293a0 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
293b0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
293c0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
293d0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
293e0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66 69 6c 6c  &info);.    fill
293f0 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
29400 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69  parentCell, 0, i
29410 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
29420 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b  0, &parentSize);
29430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 72  .    assert( par
29440 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20  entSize<64 );.  
29450 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29460 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
29470 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
29480 67 65 29 20 29 3b 0a 20 20 20 20 69 6e 73 65 72  ge) );.    inser
29490 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
294a0 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74  arentIdx, parent
294b0 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65  Cell, parentSize
294c0 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70 75 74  , 0, 4);.    put
294d0 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
294e0 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70  owCell(pParent,p
294f0 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65  arentIdx), pPage
29500 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74  ->pgno);.    put
29510 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
29520 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
29530 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
29540 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
29550 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
29560 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
29570 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
29580 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
29590 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
295a0 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
295b0 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
295c0 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
295d0 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
295e0 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
295f0 6f 77 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ow page..    */.
29600 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
29610 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
29620 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
29630 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
29640 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
29650 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
29660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29670 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
29680 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
29690 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  New, 0);.      }
296a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
296b0 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
296c0 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
296d0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
296e0 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
296f0 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
29700 73 20 70 6f 69 6e 74 20 74 68 65 20 70 50 61 67  s point the pPag
29710 65 2d 3e 6e 46 72 65 65 20 76 61 72 69 61 62 6c  e->nFree variabl
29720 65 20 69 73 20 6e 6f 74 20 73 65 74 20 63 6f 72  e is not set cor
29730 72 65 63 74 6c 79 20 77 69 74 68 0a 20 20 2a 2a  rectly with.  **
29740 20 72 65 73 70 65 63 74 20 74 6f 20 74 68 65 20   respect to the 
29750 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
29760 61 67 65 20 28 62 65 63 61 75 73 65 20 69 74 20  age (because it 
29770 77 61 73 20 73 65 74 20 74 6f 20 30 20 62 79 20  was set to 0 by 
29780 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c  .  ** insertCell
29790 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ). So call sqlit
297a0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
297b0 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69  ) to make sure i
297c0 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72 72 65 63  t is.  ** correc
297d0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  t..  **.  ** Thi
297e0 73 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65  s has to be done
297f0 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
29800 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
29810 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  ed. Normally, if
29820 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
29830 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 72 65  ccurs during tre
29840 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65  e balancing, the
29850 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d   contents of Mem
29860 50 61 67 65 20 61 72 65 0a 20 20 2a 2a 20 6e 6f  Page are.  ** no
29870 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20 61 73 20  t important, as 
29880 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63  they will be rec
29890 61 6c 63 75 6c 61 74 65 64 20 77 68 65 6e 20 74  alculated when t
298a0 68 65 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65  he page is rolle
298b0 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 42 75 74  d.  ** back. But
298c0 20 68 65 72 65 2c 20 69 6e 20 62 61 6c 61 6e 63   here, in balanc
298d0 65 5f 71 75 69 63 6b 28 29 2c 20 69 74 20 69 73  e_quick(), it is
298e0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
298f0 50 61 67 65 20 68 61 73 20 0a 20 20 2a 2a 20 6e  Page has .  ** n
29900 6f 74 20 79 65 74 20 62 65 65 6e 20 6d 61 72 6b  ot yet been mark
29910 65 64 20 64 69 72 74 79 20 6f 72 20 77 72 69 74  ed dirty or writ
29920 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
29930 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
29940 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 77 69 6c  fore.  ** it wil
29950 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  l not be rolled 
29960 62 61 63 6b 20 61 6e 64 20 73 6f 20 69 74 20 69  back and so it i
29970 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6d  s important to m
29980 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
29990 2a 2a 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ** the page data
299a0 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73 20 6f 66   and contents of
299b0 20 4d 65 6d 50 61 67 65 20 61 72 65 20 63 6f 6e   MemPage are con
299c0 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
299d0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
299e0 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
299f0 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
29a00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29a10 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
29a20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65 72  );..  /* If ever
29a30 79 74 68 69 6e 67 20 65 6c 73 65 20 73 75 63 63  ything else succ
29a40 65 65 64 65 64 2c 20 62 61 6c 61 6e 63 65 20 74  eeded, balance t
29a50 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
29a60 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65 20 74 68  in .  ** case th
29a70 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  e divider cell i
29a80 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69  nserted caused i
29a90 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72  t to become over
29aa0 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  full..  */.  if(
29ab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29ac0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
29ad0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  e(pPage);.    pC
29ae0 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20  ur->iPage--;.   
29af0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43   rc = balance(pC
29b00 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  ur, 0);.  }.  re
29b10 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
29b20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
29b30 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f  _QUICKBALANCE */
29b40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
29b50 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74  tine redistribut
29b60 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67  es Cells on pPag
29b70 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32  e and up to NN*2
29b80 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20   siblings.** of 
29b90 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c  pPage so that al
29ba0 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
29bb0 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75  ut the same amou
29bc0 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
29bd0 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20  ..** Usually NN 
29be0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
29bf0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
29c00 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20   is used in the 
29c10 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68  balancing,.** th
29c20 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e  ough more siblin
29c30 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72  gs might come fr
29c40 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70  om one side if p
29c50 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  Page is the firs
29c60 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69  t.** or last chi
29c70 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74  ld of its parent
29c80 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73 20  .  If pPage has 
29c90 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20  fewer than 2*NN 
29ca0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d  siblings.** (som
29cb0 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e  ething which can
29cc0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
29cd0 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f  pPage is the roo
29ce0 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20  t page or a .** 
29cf0 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74  child of root) t
29d00 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
29d10 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69  e siblings parti
29d20 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
29d30 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
29d40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
29d50 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d  lings of pPage m
29d60 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
29d70 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  d or decreased b
29d80 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20  y one or.** two 
29d90 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
29da0 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
29db0 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
29dc0 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f  ver full. The ro
29dd0 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70  ot page.** is sp
29de0 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c  ecial and is all
29df0 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c  owed to be nearl
29e00 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67  y empty. If pPag
29e10 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f  e is .** the roo
29e20 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
29e30 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72   depth of the tr
29e40 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ee might be incr
29e50 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72  eased.** or decr
29e60 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73  eased by one, as
29e70 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b   necessary, to k
29e80 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67  eep the root pag
29e90 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  e from being.** 
29ea0 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70  overfull or comp
29eb0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  letely empty..**
29ec0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
29ed0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
29ee0 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
29ef0 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20  of the Cells on 
29f00 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e  pPage.** might n
29f10 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
29f20 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e  tored in pPage->
29f30 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63  aData[].  This c
29f40 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
29f50 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
29f60 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74  full.  Part of t
29f70 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
29f80 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20  outine is to.** 
29f90 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65  make sure all Ce
29fa0 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e  lls for pPage on
29fb0 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20  ce again fit in 
29fc0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a  pPage->aData[]..
29fd0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75  **.** In the cou
29fe0 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67  rse of balancing
29ff0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66   the siblings of
2a000 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72 65   pPage, the pare
2a010 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d  nt of pPage.** m
2a020 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72  ight become over
2a030 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
2a040 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70 70  l.  If that happ
2a050 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ens, then this r
2a060 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
2a070 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
2a080 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a  on the parent..*
2a090 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
2a0a0 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
2a0b0 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
2a0c0 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
2a0d0 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
2a0e0 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
2a0f0 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
2a100 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
2a110 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
2a120 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
2a130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a140 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2a150 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2a160 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a170 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2a180 2f 2a 20 54 68 65 20 6f 76 65 72 20 6f 72 20 75  /* The over or u
2a190 6e 64 65 72 66 75 6c 6c 20 70 61 67 65 20 74 6f  nderfull page to
2a1a0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 4d 65   balance */.  Me
2a1b0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20  mPage *pParent; 
2a1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a1d0 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
2a1e0 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
2a1f0 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
2a200 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65      /* The whole
2a210 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
2a220 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20  nt nCell = 0;   
2a230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a240 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
2a250 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
2a260 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  int nMaxCells = 
2a270 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2a280 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
2a290 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  f apCell, szCell
2a2a0 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e  , aFrom. */.  in
2a2b0 74 20 6e 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20  t nOld = 0;     
2a2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a2d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2a2e0 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e   apOld[] */.  in
2a2f0 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20  t nNew = 0;     
2a300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a310 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2a320 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e   apNew[] */.  in
2a330 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20  t nDiv;         
2a340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a350 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
2a360 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e   apDiv[] */.  in
2a370 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20  t i, j, k;      
2a380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2a390 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2a3a0 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
2a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a3c0 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20   Index of pPage 
2a3d0 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
2a3e0 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  l[] */.  int nxD
2a3f0 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
2a400 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
2a410 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
2a420 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
2a430 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2a460 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  ode */.  int lea
2a470 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
2a480 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
2a490 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
2a4a0 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
2a4b0 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
2a4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a4d0 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
2a4e0 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
2a4f0 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
2a500 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
2a510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2a520 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
2a530 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
2a540 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
2a550 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2a560 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
2a570 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
2a580 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a5a0 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
2a5b0 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
2a5c0 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
2a5d0 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
2a5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2a5f0 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
2a600 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
2a610 20 20 69 6e 74 20 69 53 70 61 63 65 32 20 3d 20    int iSpace2 = 
2a620 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2a630 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2a640 79 74 65 20 6f 66 20 61 53 70 61 63 65 32 5b 5d  yte of aSpace2[]
2a650 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
2a660 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
2a670 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
2a680 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
2a690 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
2a6a0 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
2a6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
2a6c0 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
2a6d0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67  siblings */.  Pg
2a6e0 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20  no pgnoOld[NB]; 
2a6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2a700 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65  ge numbers for e
2a710 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c  ach page in apOl
2a720 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  d[] */.  MemPage
2a730 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
2a740 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
2a750 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
2a760 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
2a770 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
2a780 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
2a790 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
2a7a0 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
2a7b0 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50  balancing */.  P
2a7c0 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32  gno pgnoNew[NB+2
2a7d0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ];          /* P
2a7e0 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
2a7f0 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e  each page in apN
2a800 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70  ew[] */.  u8 *ap
2a810 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Div[NB];        
2a820 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
2a830 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
2a840 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
2a850 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2a860 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2a870 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
2a880 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
2a890 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
2a8a0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2a8b0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
2a8c0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
2a8d0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
2a8e0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2a8f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a900 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
2a910 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
2a920 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a940 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
2a950 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2a960 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
2a970 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  aCopy[NB];      
2a980 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
2a990 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20  holding data of 
2a9a0 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38  apCopy[] */.  u8
2a9b0 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
2a9c0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
2a9d0 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  r copies of divi
2a9e0 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66 6f 72  ders cells befor
2a9f0 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75  e balance */.  u
2aa00 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30 3b 20  8 *aSpace2 = 0; 
2aa10 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
2aa20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69 76 69  or overflow divi
2aa30 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74 65 72  ders cells after
2aa40 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38   balance */.  u8
2aa50 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20 20   *aFrom = 0;..  
2aa60 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2aa70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2aa80 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ];.  assert( sql
2aa90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2aaa0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2aab0 78 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  x) );.  VVA_ONLY
2aac0 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75  ( pCur->pagesShu
2aad0 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 0a 20 20  ffled = 1 );..  
2aae0 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68  /* .  ** Find th
2aaf0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
2ab00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
2ab10 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
2ab20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ab30 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
2ab40 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2ab50 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2ab60 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20 70  e->pDbPage) || p
2ab70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2ab80 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  =1 );.  pBt = pP
2ab90 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72  age->pBt;.  pPar
2aba0 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  ent = pCur->apPa
2abb0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
2abc0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
2abd0 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51  rent );.  if( SQ
2abe0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2abf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ac00 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2ac10 65 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  e)) ){.    goto 
2ac20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2ac30 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 28 28 22  .  }..  TRACE(("
2ac40 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
2ac50 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
2ac60 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
2ac70 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
2ac80 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  o));..#ifndef SQ
2ac90 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2aca0 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  ALANCE.  /*.  **
2acb0 20 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a   A special case:
2acc0 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79    If a new entry
2acd0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69   has just been i
2ace0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20  nserted into a. 
2acf0 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20   ** table (that 
2ad00 69 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68  is, a btree with
2ad10 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e   integer keys an
2ad20 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68  d all data at th
2ad30 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61  e leaves).  ** a
2ad40 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  nd the new entry
2ad50 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
2ad60 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2ad70 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65  tree (it has the
2ad80 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65  .  ** largest ke
2ad90 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  y) then use the 
2ada0 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f  special balance_
2adb0 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  quick() routine 
2adc0 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69  for.  ** balanci
2add0 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69  ng.  balance_qui
2ade0 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73  ck() is much fas
2adf0 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20  ter and results 
2ae00 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a  in a tighter.  *
2ae10 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74  * packing of dat
2ae20 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  a in the common 
2ae30 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
2ae40 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a   pPage->leaf &&.
2ae50 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
2ae60 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61  Key &&.      pPa
2ae70 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
2ae80 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
2ae90 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
2aea0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20  Page->nCell &&. 
2aeb0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 67       pParent->pg
2aec0 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67  no!=1 &&.      g
2aed0 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
2aee0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2aef0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
2af00 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b  pPage->pgno.  ){
2af10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2af20 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
2af30 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    /*.    ** TODO
2af40 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c  : Check the sibl
2af50 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ings to the left
2af60 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61   of pPage. It ma
2af70 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  y be that.    **
2af80 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75   they are not fu
2af90 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61  ll and no new pa
2afa0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ge is required..
2afb0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
2afc0 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  n balance_quick(
2afd0 70 43 75 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pCur);.  }.#endi
2afe0 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  f..  if( SQLITE_
2aff0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
2b000 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2b010 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  e->pDbPage)) ){.
2b020 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2b030 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
2b040 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
2b050 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
2b060 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20  rent page whose 
2b070 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  left child point
2b080 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70  s back.  ** to p
2b090 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22  Page.  The "idx"
2b0a0 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
2b0b0 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
2b0c0 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20  ell.  If pPage. 
2b0d0 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74   ** is the right
2b0e0 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
2b0f0 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69  arent then set i
2b100 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e  dx to pParent->n
2b110 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 64 78  Cell .  */.  idx
2b120 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2b130 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20  Cur->iPage-1];. 
2b140 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
2b150 65 78 28 70 50 61 72 65 6e 74 2c 20 69 64 78 2c  ex(pParent, idx,
2b160 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a   pPage->pgno);..
2b170 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73    /*.  ** Find s
2b180 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
2b190 70 50 61 67 65 20 61 6e 64 20 74 68 65 20 63 65  pPage and the ce
2b1a0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74  lls in pParent t
2b1b0 68 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20  hat divide.  ** 
2b1c0 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41  the siblings.  A
2b1d0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
2b1e0 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
2b1f0 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a  lings on either.
2b200 20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61    ** side of pPa
2b210 67 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e  ge.  More siblin
2b220 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
2b230 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
2b240 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61  ver, if.  ** pPa
2b250 67 65 20 74 68 65 72 65 20 61 72 65 20 66 65 77  ge there are few
2b260 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69  er than NN sibli
2b270 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  ngs on the other
2b280 20 73 69 64 65 2e 20 20 49 66 20 70 50 61 72 65   side.  If pPare
2b290 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
2b2a0 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
2b2b0 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
2b2c0 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
2b2d0 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20  e taken..  */.  
2b2e0 6e 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e  nxDiv = idx - NN
2b2f0 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20  ;.  if( nxDiv + 
2b300 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43  NB > pParent->nC
2b310 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  ell ){.    nxDiv
2b320 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
2b330 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a  l - NB + 1;.  }.
2b340 20 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b    if( nxDiv<0 ){
2b350 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a  .    nxDiv = 0;.
2b360 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a    }.  nDiv = 0;.
2b370 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44    for(i=0, k=nxD
2b380 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b  iv; i<NB; i++, k
2b390 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70  ++){.    if( k<p
2b3a0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
2b3b0 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
2b3c0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
2b3d0 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44  nt, k);.      nD
2b3e0 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  iv++;.      asse
2b3f0 72 74 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65  rt( !pParent->le
2b400 61 66 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  af );.      pgno
2b410 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
2b420 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
2b430 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50   }else if( k==pP
2b440 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
2b450 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
2b460 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2b470 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2b480 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2b490 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2b4a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b4b0 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  }.    rc = getAn
2b4c0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
2b4d0 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c  gnoOld[i], &apOl
2b4e0 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
2b4f0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
2b500 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 2f 2a  _cleanup;.    /*
2b510 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61   apOld[i]->idxPa
2b520 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f 0a 20 20 20  rent = k; */.   
2b530 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a   apCopy[i] = 0;.
2b540 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
2b550 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b  Old );.    nOld+
2b560 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73  +;.    nMaxCells
2b570 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
2b580 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
2b590 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a  nOverflow;.  }..
2b5a0 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
2b5b0 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
2b5c0 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
2b5d0 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
2b5e0 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
2b5f0 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
2b600 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
2b610 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
2b620 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
2b630 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
2b640 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72  res.  */.  szScr
2b650 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d  atch =.       nM
2b660 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2b670 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
2b680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
2b690 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
2b6a0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2b6b0 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
2b6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
2b6d0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52  ell */.     + (R
2b6e0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
2b6f0 50 61 67 65 29 29 2b 70 42 74 2d 3e 70 61 67 65  Page))+pBt->page
2b700 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f  Size)*NB  /* aCo
2b710 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  py */.     + pBt
2b720 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b740 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
2b750 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49  ce1 */.     + (I
2b760 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d  SAUTOVACUUM ? nM
2b770 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20  axCells : 0);   
2b780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72            /* aFr
2b790 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  om */.  apCell =
2b7a0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
2b7b0 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68  alloc( szScratch
2b7c0 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c   ); .  if( apCel
2b7d0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
2b7e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b7f0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2b800 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
2b810 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
2b820 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
2b830 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28  ;.  aCopy[0] = (
2b840 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
2b850 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
2b860 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2b870 47 4e 4d 45 4e 54 28 61 43 6f 70 79 5b 30 5d 29  GNMENT(aCopy[0])
2b880 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
2b890 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  <NB; i++){.    a
2b8a0 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79  Copy[i] = &aCopy
2b8b0 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  [i-1][pBt->pageS
2b8c0 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
2b8d0 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
2b8e0 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
2b8f0 79 5b 69 5d 20 2d 20 28 75 38 2a 29 30 29 20 26  y[i] - (u8*)0) &
2b900 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
2b910 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
2b920 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  quired */.  }.  
2b930 61 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79  aSpace1 = &aCopy
2b940 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  [NB-1][pBt->page
2b950 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
2b960 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
2b970 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2b980 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53  YTE_ALIGNMENT(aS
2b990 70 61 63 65 31 29 20 29 3b 0a 20 20 69 66 28 20  pace1) );.  if( 
2b9a0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2b9b0 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70      aFrom = &aSp
2b9c0 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69  ace1[pBt->pageSi
2b9d0 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70 61 63  ze];.  }.  aSpac
2b9e0 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e2 = sqlite3Page
2b9f0 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67 65  Malloc(pBt->page
2ba00 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53 70  Size);.  if( aSp
2ba10 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ace2==0 ){.    r
2ba20 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2ba30 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
2ba40 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2ba50 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b    .  /*.  ** Mak
2ba60 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
2ba70 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65  content of pPage
2ba80 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
2ba90 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20  s into aOld[].. 
2baa0 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
2bab0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2bac0 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
2bad0 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
2bae0 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  er.  ** that the
2baf0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
2bb00 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
2bb10 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
2bb20 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f   in the.  ** pro
2bb30 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
2bb40 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  erwritten..  */.
2bb50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
2bb60 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
2bb70 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79  Page *p = apCopy
2bb80 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
2bb90 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d 65  aCopy[i];.    me
2bba0 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69 5d  mcpy(p, apOld[i]
2bbb0 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  , sizeof(MemPage
2bbc0 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61  ));.    p->aData
2bbd0 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d 3b   = (void*)&p[1];
2bbe0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61  .    memcpy(p->a
2bbf0 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
2bc00 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
2bc10 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
2bc20 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74  .  ** Load point
2bc30 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73  ers to all cells
2bc40 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65   on sibling page
2bc50 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  s and the divide
2bc60 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
2bc70 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65  o the local apCe
2bc80 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b  ll[] array.  Mak
2bc90 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
2bca0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
2bcb0 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  ** into space ob
2bcc0 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61  tained form aSpa
2bcd0 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65  ce1[] and remove
2bce0 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72   the the divider
2bcf0 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   Cells.  ** from
2bd00 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
2bd10 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
2bd20 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
2bd30 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
2bd40 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
2bd50 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
2bd60 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
2bd70 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
2bd80 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
2bd90 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
2bda0 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e   into aSpace1[].
2bdb0 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
2bdc0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2bdd0 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
2bde0 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
2bdf0 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
2be00 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
2be10 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
2be20 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
2be30 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
2be40 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
2be50 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
2be60 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
2be70 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
2be80 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
2be90 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
2bea0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
2beb0 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
2bec0 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
2bed0 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
2bee0 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
2bef0 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
2bf00 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
2bf10 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65  keys..  */.  nCe
2bf20 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f  ll = 0;.  leafCo
2bf30 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65  rrection = pPage
2bf40 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
2bf50 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 68 61  Data = pPage->ha
2bf60 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30  sData;.  for(i=0
2bf70 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
2bf80 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
2bf90 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
2bfa0 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
2bfb0 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
2bfc0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
2bfd0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
2bfe0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
2bff0 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
2c000 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
2c010 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
2c020 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2c030 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
2c040 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
2c050 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
2c060 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
2c070 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  ;.      if( ISAU
2c080 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2c090 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20      int a;.     
2c0a0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
2c0b0 3d 20 28 75 38 29 69 3b 20 20 20 61 73 73 65 72  = (u8)i;   asser
2c0c0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 36 20 29  t( i>=0 && i<6 )
2c0d0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d  ;.        for(a=
2c0e0 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72  0; a<pOld->nOver
2c0f0 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20  flow; a++){.    
2c100 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
2c110 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d  aOvfl[a].pCell==
2c120 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b  apCell[nCell] ){
2c130 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72  .            aFr
2c140 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
2c150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2c160 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2c170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c180 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b   }.      nCell++
2c190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c1a0 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20  i<nOld-1 ){.    
2c1b0 20 20 75 31 36 20 73 7a 20 3d 20 63 65 6c 6c 53    u16 sz = cellS
2c1c0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2c1d0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2c1e0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
2c1f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68  .        /* With
2c200 20 74 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c   the LEAFDATA fl
2c210 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c  ag, pParent cell
2c220 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b  s hold only INTK
2c230 45 59 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  EYs that.       
2c240 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74   ** are duplicat
2c250 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68  es of keys on th
2c260 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20  e child pages.  
2c270 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76  We need to remov
2c280 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
2c290 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
2c2a0 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74  rom pParent, but
2c2b0 20 74 68 65 20 64 69 76 69 64 65 72 73 20 63 65   the dividers ce
2c2c0 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20  lls are not.    
2c2d0 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
2c2e0 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65  apCell[] because
2c2f0 20 74 68 65 79 20 61 72 65 20 64 75 70 6c 69 63   they are duplic
2c300 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65  ates of child ce
2c310 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lls..        */.
2c320 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
2c330 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2c340 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   sz);.      }els
2c350 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  e{.        u8 *p
2c360 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  Temp;.        as
2c370 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
2c380 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
2c390 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2c3a0 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65   sz;.        pTe
2c3b0 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53  mp = &aSpace1[iS
2c3c0 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 20 20  pace1];.        
2c3d0 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
2c3e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2c3f0 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
2c400 2f 34 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  /4 );.        as
2c410 73 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70  sert( iSpace1<=p
2c420 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
2c430 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
2c440 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Temp, apDiv[i], 
2c450 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  sz);.        apC
2c460 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
2c470 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
2c480 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  n;.        if( I
2c490 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2c4a0 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e           aFrom[n
2c4b0 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20  Cell] = 0xFF;.  
2c4c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c4d0 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
2c4e0 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
2c4f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2c500 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2c510 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  || leafCorrectio
2c520 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
2c530 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d  szCell[nCell] -=
2c540 20 28 75 31 36 29 6c 65 61 66 43 6f 72 72 65 63   (u16)leafCorrec
2c550 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  tion;.        as
2c560 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 70  sert( get4byte(p
2c570 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69  Temp)==pgnoOld[i
2c580 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ] );.        if(
2c590 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
2c5a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c5b0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2c5c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2c5d0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
2c5e0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
2c5f0 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
2c600 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
2c610 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
2c620 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
2c630 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
2c640 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
2c650 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
2c660 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72  >aData[pOld->hdr
2c670 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20  Offset+8], 4);. 
2c680 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c690 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c6a0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2c6b0 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  4 );.          i
2c6c0 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  f( szCell[nCell]
2c6d0 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
2c6e0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
2c6f0 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
2c700 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
2c710 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
2c720 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2c730 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
2c740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c750 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
2c760 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2c770 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
2c780 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
2c790 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
2c7a0 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
2c7b0 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
2c7c0 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
2c7d0 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
2c7e0 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
2c7f0 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
2c800 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
2c810 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
2c820 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
2c830 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
2c840 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
2c850 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
2c860 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
2c870 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
2c880 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
2c890 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
2c8a0 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
2c8b0 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
2c8c0 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
2c8d0 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
2c8e0 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
2c8f0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2c900 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
2c910 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
2c920 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
2c930 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
2c940 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
2c950 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
2c960 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
2c970 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
2c980 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
2c990 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
2c9a0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
2c9b0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
2c9c0 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
2c9d0 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
2c9e0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
2c9f0 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
2ca00 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
2ca10 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
2ca20 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
2ca30 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
2ca40 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
2ca50 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
2ca60 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
2ca70 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
2ca80 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
2ca90 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
2caa0 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
2cab0 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
2cac0 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
2cad0 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
2cae0 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
2caf0 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
2cb00 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
2cb10 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
2cb20 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
2cb30 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
2cb40 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
2cb50 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
2cb60 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
2cb70 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
2cb80 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
2cb90 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
2cba0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
2cbb0 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
2cbc0 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
2cbd0 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
2cbe0 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
2cbf0 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
2cc00 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
2cc10 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
2cc20 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
2cc30 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
2cc40 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
2cc50 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
2cc60 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
2cc70 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
2cc80 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
2cc90 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
2cca0 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
2ccb0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
2ccc0 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
2ccd0 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
2cce0 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
2ccf0 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
2cd00 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
2cd10 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
2cd20 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
2cd30 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
2cd40 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
2cd50 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
2cd60 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
2cd70 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
2cd80 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
2cd90 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
2cda0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
2cdb0 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
2cdc0 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
2cdd0 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
2cde0 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
2cdf0 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
2ce00 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
2ce10 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
2ce20 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
2ce30 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
2ce40 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2ce50 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
2ce60 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
2ce70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2ce90 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
2cea0 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
2ceb0 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
2cec0 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
2ced0 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
2cee0 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
2cef0 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
2cf00 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
2cf10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
2cf20 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2cf30 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
2cf40 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a  =0 || szRight+sz
2cf50 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66  Cell[d]+2<=szLef
2cf60 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20  t-(szCell[r]+2) 
2cf70 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
2cf80 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
2cf90 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
2cfa0 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
2cfb0 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
2cfc0 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
2cfd0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
2cfe0 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
2cff0 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
2d000 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
2d010 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
2d020 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
2d030 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
2d040 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
2d050 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
2d060 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
2d070 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a 20 20  or we are the.  
2d080 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  ** a virtual roo
2d090 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75  t page.  A virtu
2d0a0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
2d0b0 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f  when the real ro
2d0c0 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20  ot.  ** page is 
2d0d0 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72  page 1 and we ar
2d0e0 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  e the only child
2d0f0 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20   of that page.. 
2d100 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e   */.  assert( cn
2d110 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50  tNew[0]>0 || (pP
2d120 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26  arent->pgno==1 &
2d130 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
2d140 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  ==0) );..  /*.  
2d150 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
2d160 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
2d170 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
2d180 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
2d190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d1a0 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65  pgno>1 );.  page
2d1b0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61  Flags = pPage->a
2d1c0 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
2d1d0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
2d1e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
2d1f0 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
2d200 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
2d210 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
2d220 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  d[i];.      pgno
2d230 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64  New[i] = pgnoOld
2d240 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
2d250 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
2d260 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d270 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
2d280 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
2d290 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
2d2a0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
2d2b0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
2d2c0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2d2d0 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
2d2e0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2d2f0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
2d300 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70  , &pgnoNew[i], p
2d310 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b  gnoNew[i-1], 0);
2d320 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2d330 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2d340 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
2d350 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
2d360 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d     nNew++;.    }
2d370 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
2d380 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
2d390 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
2d3a0 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
2d3b0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
2d3c0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20  <nOld ){.    rc 
2d3d0 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64  = freePage(apOld
2d3e0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
2d3f0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
2d400 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
2d410 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
2d420 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
2d430 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
2d440 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
2d450 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
2d460 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
2d470 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
2d480 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
2d490 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
2d4a0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
2d4b0 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
2d4c0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
2d4d0 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
2d4e0 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
2d4f0 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
2d500 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
2d510 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
2d520 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
2d530 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
2d540 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
2d550 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
2d560 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
2d570 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
2d580 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
2d590 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
2d5a0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
2d5b0 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
2d5c0 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
2d5d0 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
2d5e0 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
2d5f0 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
2d600 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
2d610 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
2d620 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
2d630 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
2d640 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
2d650 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
2d660 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2d670 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
2d680 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f   int minV = pgno
2d690 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  New[i];.    int 
2d6a0 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f  minI = i;.    fo
2d6b0 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b  r(j=i+1; j<k; j+
2d6c0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67  +){.      if( pg
2d6d0 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e  noNew[j]<(unsign
2d6e0 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20  ed)minV ){.     
2d6f0 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20     minI = j;.   
2d700 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f       minV = pgno
2d710 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  New[j];.      }.
2d720 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
2d730 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
2d740 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
2d750 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
2d760 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
2d770 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
2d780 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
2d790 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69  [i] = pgnoNew[mi
2d7a0 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
2d7b0 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
2d7c0 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
2d7d0 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20  [minI] = t;.    
2d7e0 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
2d7f0 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
2d800 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2d810 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20   old: %d %d %d  
2d820 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
2d830 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
2d840 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
2d850 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20  pgnoOld[0], .   
2d860 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f   nOld>=2 ? pgnoO
2d870 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ld[1] : 0,.    n
2d880 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64  Old>=3 ? pgnoOld
2d890 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e  [2] : 0,.    pgn
2d8a0 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30  oNew[0], szNew[0
2d8b0 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
2d8c0 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c   pgnoNew[1] : 0,
2d8d0 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
2d8e0 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
2d8f0 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32  w>=3 ? pgnoNew[2
2d900 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  ] : 0, nNew>=3 ?
2d910 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
2d920 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e     nNew>=4 ? pgn
2d930 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[3] : 0, nNe
2d940 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
2d950 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
2d960 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20   ? pgnoNew[4] : 
2d970 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
2d980 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
2d990 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
2d9a0 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
2d9b0 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
2d9c0 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
2d9d0 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
2d9e0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
2d9f0 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
2da00 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
2da10 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
2da20 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
2da30 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
2da40 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
2da50 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
2da60 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
2da70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
2da80 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
2da90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2daa0 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e  New->pgno==pgnoN
2dab0 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 7a 65 72  ew[i] );.    zer
2dac0 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65  oPage(pNew, page
2dad0 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65  Flags);.    asse
2dae0 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63  mblePage(pNew, c
2daf0 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43  ntNew[i]-j, &apC
2db00 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b  ell[j], &szCell[
2db10 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j]);.    assert(
2db20 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c   pNew->nCell>0 |
2db30 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e  | (nNew==1 && cn
2db40 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20  tNew[0]==0) );. 
2db50 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2db60 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2db70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2db80 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2db90 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
2dba0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
2dbb0 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
2dbc0 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
2dbd0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68   the siblings th
2dbe0 61 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67  at were rearrang
2dbf0 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65  ed. These can be
2dc00 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68  : left.    ** ch
2dc10 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c  ildren of cells,
2dc20 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
2dc30 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72   of the page, or
2dc40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
2dc50 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74      ** pointed t
2dc60 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20  o by cells..    
2dc70 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2dc80 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2dc90 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e   for(k=j; k<cntN
2dca0 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ew[i]; k++){.   
2dcb0 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
2dcc0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2dcd0 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d      if( aFrom[k]
2dce0 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79  ==0xFF || apCopy
2dcf0 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f  [aFrom[k]]->pgno
2dd00 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a  !=pNew->pgno ){.
2dd10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2dd20 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65  trmapPutOvfl(pNe
2dd30 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20  w, k-j);.       
2dd40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2dd50 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 6f 72 72  E_OK && leafCorr
2dd60 65 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  ection==0 ){.   
2dd70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
2dd80 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74  rmapPut(pBt, get
2dd90 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 6b 5d 29  4byte(apCell[k])
2dda0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2ddb0 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  pNew->pgno);.   
2ddc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ddd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2dde0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ddf0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2de00 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2de10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2de20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2de30 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
2de40 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2de50 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
2de60 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
2de70 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
2de80 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
2de90 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
2dea0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
2deb0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2dec0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ded0 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43  i<nNew-1 && j<nC
2dee0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
2def0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
2df00 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
2df10 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
2df20 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
2df30 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
2df40 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
2df50 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
2df60 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
2df70 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
2df80 20 3d 20 26 61 53 70 61 63 65 32 5b 69 53 70 61   = &aSpace2[iSpa
2df90 63 65 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ce2];.      if( 
2dfa0 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
2dfb0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2dfc0 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
2dfd0 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
2dfe0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2dff0 55 4d 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  UM .         && 
2e000 28 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20  (aFrom[j]==0xFF 
2e010 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
2e020 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  j]]->pgno!=pNew-
2e030 3e 70 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  >pgno).        )
2e040 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2e050 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2e060 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
2e070 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2e080 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  New->pgno);.    
2e090 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e0a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e0b0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2e0c0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2e0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e0e0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2e0f0 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
2e100 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2e110 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
2e120 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
2e130 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
2e140 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
2e150 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
2e160 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
2e170 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
2e180 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
2e190 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
2e1a0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
2e1b0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
2e1c0 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
2e1d0 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
2e1e0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
2e1f0 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
2e200 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
2e210 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e220 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2e230 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
2e240 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
2e250 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2e260 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
2e270 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
2e280 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
2e290 20 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c         rc = fill
2e2a0 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
2e2b0 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e  pCell, 0, info.n
2e2c0 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73  Key, 0, 0, 0, &s
2e2d0 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
2e2e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e2f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2e300 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2e310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e320 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20     pTemp = 0;.  
2e330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e340 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20     pCell -= 4;. 
2e350 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72         /* Obscur
2e360 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c  e case for non-l
2e370 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20  eaf-data trees: 
2e380 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70  If the cell at p
2e390 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20  Cell was.       
2e3a0 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73   ** previously s
2e3b0 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20  tored on a leaf 
2e3c0 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65  node, and its re
2e3d0 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20  ported size was 
2e3e0 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  4.        ** byt
2e3f0 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  es, then it may 
2e400 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c  actually be smal
2e410 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20  ler than this . 
2e420 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73         ** (see s
2e430 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
2e440 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74  CellPtr(), 4 byt
2e450 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75  es is the minimu
2e460 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20  m size of.      
2e470 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20    ** any cell). 
2e480 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74  But it is import
2e490 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20  ant to pass the 
2e4a0 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20  correct size to 
2e4b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65  .        ** inse
2e4c0 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70  rtCell(), so rep
2e4d0 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f  arse the cell no
2e4e0 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  w..        **.  
2e4f0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
2e500 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65  at this can neve
2e510 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53  r happen in an S
2e520 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c  QLite data file,
2e530 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20   as all.        
2e540 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20  ** cells are at 
2e550 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49  least 4 bytes. I
2e560 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  t only happens i
2e570 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20  n b-trees used. 
2e580 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61         ** to eva
2e590 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43  luate "IN (SELEC
2e5a0 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69  T ...)" and simi
2e5b0 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20  lar clauses..   
2e5c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e5d0 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34  if( szCell[j]==4
2e5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
2e5f0 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74  sert(leafCorrect
2e600 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20  ion==4);.       
2e610 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
2e620 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65  Ptr(pParent, pCe
2e630 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
2e640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 70       }.      iSp
2e650 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace2 += sz;.    
2e660 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
2e670 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b  t->pageSize/4 );
2e680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2e690 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67  Space2<=pBt->pag
2e6a0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72  eSize );.      r
2e6b0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2e6c0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70  Parent, nxDiv, p
2e6d0 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c  Cell, sz, pTemp,
2e6e0 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   4);.      if( r
2e6f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2e700 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2e710 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nup;.      asser
2e720 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2e730 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2e740 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2e750 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
2e760 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2e770 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20  pParent,nxDiv), 
2e780 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  pNew->pgno);..  
2e790 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2e7a0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
2e7b0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e   database, and n
2e7c0 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  ot a leaf-data t
2e7d0 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ree,.      ** th
2e7e0 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  en update the po
2e7f0 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61  inter map with a
2e800 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
2e810 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
2e820 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
2e830 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74  cell just insert
2e840 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66  ed points to (if
2e850 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
2e860 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
2e870 56 41 43 55 55 4d 20 26 26 20 21 6c 65 61 66 44  VACUUM && !leafD
2e880 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ata ){.        r
2e890 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
2e8a0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2e8b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2e8c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e8d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
2e8e0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2e8f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e900 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  }.      j++;.   
2e910 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
2e920 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
2e930 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2e940 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  try for the new 
2e950 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
2e960 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2e970 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
2e980 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2e990 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50  t, pNew->pgno, P
2e9a0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2e9b0 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  rent->pgno);.   
2e9c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e9d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e9e0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2e9f0 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  anup;.      }.  
2ea00 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
2ea10 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ( j==nCell );.  
2ea20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29  assert( nOld>0 )
2ea30 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
2ea40 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67  >0 );.  if( (pag
2ea50 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41  eFlags & PTF_LEA
2ea60 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  F)==0 ){.    u8 
2ea70 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70  *zChild = &apCop
2ea80 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
2ea90 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [8];.    memcpy(
2eaa0 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
2eab0 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64  aData[8], zChild
2eac0 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 4);.    if( IS
2ead0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2eae0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2eaf0 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ut(pBt, get4byte
2eb00 28 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d 41 50  (zChild), PTRMAP
2eb10 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 6e 4e  _BTREE, apNew[nN
2eb20 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20  ew-1]->pgno);.  
2eb30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2eb40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2eb50 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2eb60 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20  eanup;.      }. 
2eb70 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2eb80 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2eb90 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2eba0 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2ebb0 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61    if( nxDiv==pPa
2ebc0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72  rent->nCell+pPar
2ebd0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
2ebe0 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d  {.    /* Right-m
2ebf0 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74  ost sibling is t
2ec00 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  he right-most ch
2ec10 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a  ild of pParent *
2ec20 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
2ec30 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2ec40 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2ec50 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  t+8], pgnoNew[nN
2ec60 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  ew-1]);.  }else{
2ec70 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
2ec80 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
2ec90 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20  e left child of 
2eca0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2ecb0 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a  in pParent.    *
2ecc0 2a 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74  * past the right
2ecd0 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e  -most divider en
2ece0 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  try */.    put4b
2ecf0 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
2ed00 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
2ed10 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  Div), pgnoNew[nN
2ed20 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ew-1]);.  }..  /
2ed30 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74  *.  ** Balance t
2ed40 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
2ed50 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
2ed60 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  urrent page (pPa
2ed70 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68  ge) might.  ** h
2ed80 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74  ave been added t
2ed90 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 73  o the freelist s
2eda0 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f  o it might no lo
2edb0 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c 69  nger be initiali
2edc0 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  zed..  ** But th
2edd0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 69  e parent page wi
2ede0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 69  ll always be ini
2edf0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
2ee00 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
2ee10 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 73 71  ->isInit );.  sq
2ee20 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
2ee30 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70 43 65  (apCell);.  apCe
2ee40 6c 6c 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 28  ll = 0;.  TRACE(
2ee50 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
2ee60 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64  hed with %d: old
2ee70 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
2ee80 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
2ee90 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e    pPage->pgno, n
2eea0 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
2eeb0 29 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ));.  pPage->nOv
2eec0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 72 65  erflow = 0;.  re
2eed0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2eee0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  ;.  pCur->iPage-
2eef0 2d 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  -;.  rc = balanc
2ef00 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 0a 20  e(pCur, 0);.  . 
2ef10 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
2ef20 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2ef30 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
2ef40 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
2ef50 65 33 50 61 67 65 46 72 65 65 28 61 53 70 61 63  e3PageFree(aSpac
2ef60 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  e2);.  sqlite3Sc
2ef70 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
2ef80 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2ef90 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
2efa0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
2efb0 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
2efc0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
2efd0 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
2efe0 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
2eff0 20 7d 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67   }.  pCur->apPag
2f000 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2f010 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
2f020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f030 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2f040 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
2f050 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2f060 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74  f a btree when t
2f070 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
2f080 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
2f090 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  s.  This is an o
2f0a0 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61  pportunity to ma
2f0b0 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73  ke the tree.** s
2f0c0 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20  hallower by one 
2f0d0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
2f0e0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61   int balance_sha
2f0f0 6c 6c 6f 77 65 72 28 42 74 43 75 72 73 6f 72 20  llower(BtCursor 
2f100 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2f110 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
2f120 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
2f130 61 67 65 20 6f 66 20 42 2d 54 72 65 65 20 2a 2f  age of B-Tree */
2f140 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
2f150 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2f160 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c  /* The only chil
2f170 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 20  d page of pPage 
2f180 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
2f190 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
2f1a0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2f1b0 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20   for pChild */. 
2f1c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2f1d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
2f1e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
2f1f0 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
2f200 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
2f210 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
2f220 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2f230 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72 65   BTree structure
2f240 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c   */.  int mxCell
2f250 50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20 20  PerPage;        
2f260 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
2f270 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65  mber of cells pe
2f280 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  r page */.  u8 *
2f290 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *apCell;        
2f2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
2f2b0 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73  cells from pages
2f2c0 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20   being balanced 
2f2d0 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
2f2e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f2f0 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
2f300 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
2f310 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2f320 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 70  >iPage==0 );.  p
2f330 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2f340 61 67 65 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72  age[0];..  asser
2f350 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
2f360 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2f370 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2f380 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2f390 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20 3d  utex) );.  pBt =
2f3a0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d   pPage->pBt;.  m
2f3b0 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d  xCellPerPage = M
2f3c0 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61  X_CELL(pBt);.  a
2f3d0 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d  pCell = sqlite3M
2f3e0 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65 72  alloc( mxCellPer
2f3f0 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a  Page*(sizeof(u8*
2f400 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29 20 29  )+sizeof(u16)) )
2f410 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d  ;.  if( apCell==
2f420 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2f430 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c  E_NOMEM;.  szCel
2f440 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c  l = (u16*)&apCel
2f450 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 5d  l[mxCellPerPage]
2f460 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
2f470 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  eaf ){.    /* Th
2f480 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c  e table is compl
2f490 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20  etely empty */. 
2f4a0 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2f4b0 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65 20  CE: empty table 
2f4c0 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
2f4d0 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no));.  }else{. 
2f4e0 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70     /* The root p
2f4f0 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75 74  age is empty but
2f500 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20   has one child. 
2f510 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20   Transfer the.  
2f520 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
2f530 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63   from that one c
2f540 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72 6f  hild into the ro
2f550 6f 74 20 70 61 67 65 20 69 66 20 69 74 20 0a 20  ot page if it . 
2f560 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20     ** will fit. 
2f570 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74 68   This reduces th
2f580 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
2f590 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  ree by one..    
2f5a0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
2f5b0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70 61   root page is pa
2f5c0 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65 73  ge 1, it has les
2f5d0 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  s space availabl
2f5e0 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74  e than.    ** it
2f5f0 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20  s child (due to 
2f600 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65 61  the 100 byte hea
2f610 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73 20  der that occurs 
2f620 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2f630 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64  .    ** of the d
2f640 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f  atabase fle), so
2f650 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65   it might not be
2f660 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c   able to hold al
2f670 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  l of the .    **
2f680 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72   information cur
2f690 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64  rently contained
2f6a0 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20 20   in the child.  
2f6b0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 0a  If this is the .
2f6c0 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
2f6d0 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20  n do not do the 
2f6e0 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76 65  transfer.  Leave
2f6f0 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65 78   page 1 empty ex
2f700 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
2f710 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
2f720 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 70  r to the child p
2f730 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64 20  age.  The child 
2f740 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20 20  page becomes.   
2f750 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20   ** the virtual 
2f760 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65  root of the tree
2f770 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 56 56 41  ..    */.    VVA
2f780 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67  _ONLY( pCur->pag
2f790 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29  esShuffled = 1 )
2f7a0 3b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  ;.    pgnoChild 
2f7b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2f7c0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2f7d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2f7e0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43     assert( pgnoC
2f7f0 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73  hild>0 );.    as
2f800 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c  sert( pgnoChild<
2f810 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
2f820 70 50 61 67 65 2d 3e 70 42 74 29 20 29 3b 0a 20  pPage->pBt) );. 
2f830 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2f840 74 72 65 65 47 65 74 50 61 67 65 28 70 50 61 67  treeGetPage(pPag
2f850 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c  e->pBt, pgnoChil
2f860 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a  d, &pChild, 0);.
2f870 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2f880 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
2f890 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70  lance;.    if( p
2f8a0 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b  Page->pgno==1 ){
2f8b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2f8c0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
2f8d0 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
2f8e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2f8f0 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2f900 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
2f910 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
2f920 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ow==0 );.      i
2f930 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65  f( pChild->nFree
2f940 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  >=100 ){.       
2f950 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e   /* The child in
2f960 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66  formation will f
2f970 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70  it on the root p
2f980 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20  age, so do the. 
2f990 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a         ** copy *
2f9a0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
2f9b0 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67  .        zeroPag
2f9c0 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
2f9d0 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
2f9e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2f9f0 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  Child->nCell; i+
2fa00 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70  +){.          ap
2fa10 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65  Cell[i] = findCe
2fa20 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20  ll(pChild,i);.  
2fa30 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69          szCell[i
2fa40 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
2fa50 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69  pChild, apCell[i
2fa60 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
2fa70 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61        assemblePa
2fa80 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
2fa90 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c  ->nCell, apCell,
2faa0 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20   szCell);.      
2fab0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69    /* Copy the ri
2fac0 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght-pointer of t
2fad0 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20  he child to the 
2fae0 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2faf0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2fb00 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2fb10 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2fb20 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  e) );.        pu
2fb30 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2fb40 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2fb50 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20  ffset+8], .     
2fb60 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
2fb70 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70  &pChild->aData[p
2fb80 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  Child->hdrOffset
2fb90 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 72  +8]));.        r
2fba0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 43 68  c = freePage(pCh
2fbb0 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ild);.        TR
2fbc0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
2fbd0 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72  hild %d transfer
2fbe0 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   to page 1\n", p
2fbf0 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
2fc00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fc10 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
2fc20 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   has more inform
2fc30 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
2fc40 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e  fit on the root.
2fc50 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
2fc60 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
2fc70 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f  balanced.  Do no
2fc80 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  thing. */.      
2fc90 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2fca0 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c  E: child %d will
2fcb0 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65   not fit on page
2fcc0 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
2fcd0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gno));.      }. 
2fce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fcf0 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44  memcpy(pPage->aD
2fd00 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  ata, pChild->aDa
2fd10 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ta, pPage->pBt->
2fd20 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
2fd30 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
2fd40 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2fd50 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2fd60 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
2fd70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2fd80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2fd90 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
2fda0 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ld);.      TRACE
2fdb0 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e  (("BALANCE: tran
2fdc0 73 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e  sfer child %d in
2fdd0 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20  to root %d\n",. 
2fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68               pCh
2fdf0 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65  ild->pgno, pPage
2fe00 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
2fe10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2fe20 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2fe30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2fe40 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2fe50 4d 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  M.    if( ISAUTO
2fe60 56 41 43 55 55 4d 20 26 26 20 72 63 3d 3d 53 51  VACUUM && rc==SQ
2fe70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fe80 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
2fe90 72 6d 61 70 73 28 70 50 61 67 65 29 3b 0a 20 20  rmaps(pPage);.  
2fea0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
2feb0 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
2fec0 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c  d);.  }.end_shal
2fed0 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73  low_balance:.  s
2fee0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43 65  qlite3_free(apCe
2fef0 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ll);.  return rc
2ff00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
2ff10 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65  root page is ove
2ff20 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rfull.**.** When
2ff30 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43   this happens, C
2ff40 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c  reate a new chil
2ff50 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20  d page and copy 
2ff60 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
2ff70 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f  of the root into
2ff80 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65   the child.  The
2ff90 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a  n make the root.
2ffa0 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79  ** page an empty
2ffb0 20 70 61 67 65 20 77 69 74 68 20 72 69 67 68 74   page with right
2ffc0 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74  Child pointing t
2ffd0 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69  o the new.** chi
2ffe0 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63  ld.   Finally, c
2fff0 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65  all balance_inte
30000 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65  rnal() on the ne
30010 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61  w child.** to ca
30020 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e  use it to split.
30030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
30040 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 42 74  alance_deeper(Bt
30050 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
30060 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
30070 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
30080 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  alue from subpro
30090 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d  cedures */.  Mem
300a0 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
300b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
300c0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a  he root page */.
300d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
300e0 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  d;    /* Pointer
300f0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
30100 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
30110 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a  gnoChild;     /*
30120 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
30130 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
30140 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
30150 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f   *pBt;         /
30160 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20  * The BTree */. 
30170 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
30180 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73       /* Total us
30190 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70  able size of a p
301a0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  age */.  u8 *dat
301b0 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
301c0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  Content of the p
301d0 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
301e0 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20  u8 *cdata;      
301f0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
30200 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
30210 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
30220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
30230 73 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64  set to page head
30240 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  er in parent */.
30250 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
30260 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
30270 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  to content of fi
30280 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65  rst cell in pare
30290 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
302a0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
302b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
302c0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 6e 4f  r->apPage[0]->nO
302d0 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20  verflow>0 );..  
302e0 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
302f0 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
30300 31 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  1 );.  pPage = p
30310 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
30320 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
30330 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
30340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
30350 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
30360 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30370 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
30380 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
30390 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  ) );.  rc = allo
303a0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
303b0 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e  t, &pChild, &pgn
303c0 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70  oChild, pPage->p
303d0 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  gno, 0);.  if( r
303e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
303f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30400 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
30410 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65  (pChild->pDbPage
30420 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
30430 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
30440 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ize;.  data = pP
30450 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
30460 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
30470 66 73 65 74 3b 0a 20 20 63 62 72 6b 20 3d 20 67  fset;.  cbrk = g
30480 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
30490 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d  r+5]);.  cdata =
304a0 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a   pChild->aData;.
304b0 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20    memcpy(cdata, 
304c0 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67  &data[hdr], pPag
304d0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
304e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72  pPage->nCell-hdr
304f0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61  );.  memcpy(&cda
30500 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  ta[cbrk], &data[
30510 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
30520 65 2d 63 62 72 6b 29 3b 0a 0a 20 20 61 73 73 65  e-cbrk);..  asse
30530 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e  rt( pChild->isIn
30540 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  it==0 );.  rc = 
30550 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
30560 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
30570 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30580 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  K ){.    int nCo
30590 70 79 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65  py = pPage->nOve
305a0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61  rflow*sizeof(pPa
305b0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 3b 0a 20  ge->aOvfl[0]);. 
305c0 20 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64     memcpy(pChild
305d0 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e  ->aOvfl, pPage->
305e0 61 4f 76 66 6c 2c 20 6e 43 6f 70 79 29 3b 0a 20  aOvfl, nCopy);. 
305f0 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72     pChild->nOver
30600 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f  flow = pPage->nO
30610 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
30620 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
30630 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 43 68 69  ow ){.      pChi
30640 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ld->nFree = 0;. 
30650 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
30660 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d   pChild->nCell==
30670 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
30680 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
30690 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
306a0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
306b0 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  ge) );.    zeroP
306c0 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
306d0 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50  d->aData[0] & ~P
306e0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 70 75  TF_LEAF);.    pu
306f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
30700 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
30710 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
30720 69 6c 64 29 3b 0a 20 20 20 20 54 52 41 43 45 28  ild);.    TRACE(
30730 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
30740 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
30750 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
30760 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
30770 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
30780 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
30790 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
307a0 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c  t, pChild->pgno,
307b0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
307c0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66  Page->pgno);.#if
307d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
307e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
307f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30800 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
30810 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
30820 61 70 73 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  aps(pChild);.   
30830 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
30840 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 68  c ){.        pCh
30850 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
30860 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
30870 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
30880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30890 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69  K ){.    pCur->i
308a0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 70 43 75 72  Page++;.    pCur
308b0 2d 3e 61 70 50 61 67 65 5b 31 5d 20 3d 20 70 43  ->apPage[1] = pC
308c0 68 69 6c 64 3b 0a 20 20 20 20 70 43 75 72 2d 3e  hild;.    pCur->
308d0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
308e0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
308f0 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  onroot(pCur);.  
30900 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
30910 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
30920 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
30930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
30940 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75  age that pCur cu
30950 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
30960 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  o has just been 
30970 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73  modified in.** s
30980 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75  ome way. This fu
30990 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f  nction figures o
309a0 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66  ut if this modif
309b0 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  ication means th
309c0 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20  e.** tree needs 
309d0 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20  to be balanced, 
309e0 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20  and if so calls 
309f0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
30a00 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f  balancing .** ro
30a10 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61  utine..** .** Pa
30a20 72 61 6d 65 74 65 72 20 69 73 49 6e 73 65 72 74  rameter isInsert
30a30 20 69 73 20 74 72 75 65 20 69 66 20 61 20 6e 65   is true if a ne
30a40 77 20 63 65 6c 6c 20 77 61 73 20 6a 75 73 74 20  w cell was just 
30a50 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
30a60 65 0a 2a 2a 20 70 61 67 65 2c 20 6f 72 20 66 61  e.** page, or fa
30a70 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
30a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
30a90 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70  ance(BtCursor *p
30aa0 43 75 72 2c 20 69 6e 74 20 69 73 49 6e 73 65 72  Cur, int isInser
30ab0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
30ac0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
30ad0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
30ae0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
30af0 69 50 61 67 65 5d 3b 0a 0a 20 20 61 73 73 65 72  iPage];..  asser
30b00 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30b10 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
30b20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
30b30 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
30b40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
30b50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30b60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
30b70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30b80 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e  TE_OK && pPage->
30b90 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20  nOverflow>0 ){. 
30ba0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
30bb0 65 5f 64 65 65 70 65 72 28 70 43 75 72 29 3b 0a  e_deeper(pCur);.
30bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
30bd0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 70  ur->apPage[0]==p
30be0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Page );.      as
30bf0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
30c00 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63 21  erflow==0 || rc!
30c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
30c20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
30c30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
30c40 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
30c50 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
30c60 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 43 75  ce_shallower(pCu
30c70 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
30c80 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
30c90 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20  ]==pPage );.    
30ca0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
30cb0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
30cc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
30ce0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
30cf0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a  nOverflow>0 || .
30d00 20 20 20 20 20 20 20 20 28 21 69 73 49 6e 73 65          (!isInse
30d10 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  rt && pPage->nFr
30d20 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ee>pPage->pBt->u
30d30 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29  sableSize*2/3) )
30d40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
30d50 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75  ance_nonroot(pCu
30d60 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
30d70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30d80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
30d90 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73   checks all curs
30da0 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ors that point t
30db0 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74  o table pgnoRoot
30dc0 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74  ..** If any of t
30dd0 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65 72  hose cursors wer
30de0 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  e opened with wr
30df0 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66  Flag==0 in a dif
30e00 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61  ferent.** databa
30e10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61  se connection (a
30e20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
30e30 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73  tion that shares
30e40 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61   the pager.** ca
30e50 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75 72  che with the cur
30e60 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  rent connection)
30e70 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20   and that other 
30e80 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69  connection .** i
30e90 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61  s not in the Rea
30ea0 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74  dUncommmitted st
30eb0 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ate, then this r
30ec0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a  outine returns .
30ed0 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ** SQLITE_LOCKED
30ee0 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20  ..**.** As well 
30ef0 61 73 20 63 75 72 73 6f 72 73 20 77 69 74 68 20  as cursors with 
30f00 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f  wrFlag==0, curso
30f10 72 73 20 77 69 74 68 20 0a 2a 2a 20 69 73 49 6e  rs with .** isIn
30f20 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20  crblobHandle==1 
30f30 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65  are also conside
30f40 72 65 64 20 27 72 65 61 64 27 20 63 75 72 73 6f  red 'read' curso
30f50 72 73 20 62 65 63 61 75 73 65 0a 2a 2a 20 69 6e  rs because.** in
30f60 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
30f70 75 72 73 6f 72 73 20 61 72 65 20 75 73 65 64 20  ursors are used 
30f80 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
30f90 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a   and writing..**
30fa0 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f  .** When pgnoRoo
30fb0 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
30fc0 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20  ge of an intkey 
30fd0 74 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63  table, this func
30fe0 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  tion is also.** 
30ff0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
31000 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63  invalidating inc
31010 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
31020 72 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74  rsors when the t
31030 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77  able row.** on w
31040 68 69 63 68 20 74 68 65 79 20 61 72 65 20 6f 70  hich they are op
31050 65 6e 65 64 20 69 73 20 64 65 6c 65 74 65 64 20  ened is deleted 
31060 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72  or modified. Cur
31070 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
31080 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  ated.** accordin
31090 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  g to the followi
310a0 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng rules:.**.** 
310b0 20 20 31 29 20 57 68 65 6e 20 42 74 72 65 65 43    1) When BtreeC
310c0 6c 65 61 72 54 61 62 6c 65 28 29 20 69 73 20 63  learTable() is c
310d0 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
310e0 65 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 63  ely delete the c
310f0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20  ontents.**      
31100 6f 66 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c  of a B-Tree tabl
31110 65 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73  e, pExclude is s
31120 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70  et to zero and p
31130 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73  arameter iRow is
31140 20 0a 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f   .**      set to
31150 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
31160 69 73 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72  is case all incr
31170 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
31180 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20  sors open.**    
31190 20 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72    on the table r
311a0 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f  ooted at pgnoRoo
311b0 74 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  t are invalidate
311c0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68  d..**.**   2) Wh
311d0 65 6e 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  en BtreeInsert()
311e0 2c 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20  , BtreeDelete() 
311f0 6f 72 20 42 74 72 65 65 50 75 74 44 61 74 61 28  or BtreePutData(
31200 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a  ) is called to .
31210 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61  **      modify a
31220 20 74 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61   table row via a
31230 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c  n SQL statement,
31240 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74   pExclude is set
31250 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   to the .**     
31260 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 75 73   write cursor us
31270 65 64 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64  ed to do the mod
31280 69 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61  ification and pa
31290 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20  rameter iRow is 
312a0 73 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  set.**      to t
312b0 68 65 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69  he integer row i
312c0 64 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20  d of the B-Tree 
312d0 65 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69  entry being modi
312e0 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20  fied. Unless.** 
312f0 20 20 20 20 20 70 45 78 63 6c 75 64 65 20 69 73       pExclude is
31300 20 69 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65   itself an incre
31310 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
31320 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63  or, then all inc
31330 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20  remental.**     
31340 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70   blob cursors op
31350 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f  en on row iRow o
31360 66 20 74 68 65 20 42 2d 54 72 65 65 20 61 72 65  f the B-Tree are
31370 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a   invalidated..**
31380 0a 2a 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68  .**   3) If both
31390 20 70 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52   pExclude and iR
313a0 6f 77 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65  ow are set to ze
313b0 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74  ro, no increment
313c0 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20  al blob .**     
313d0 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76   cursors are inv
313e0 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  alidated..*/.sta
313f0 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
31400 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 0a 20  ReadConflicts(. 
31410 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
31420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31430 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
31440 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f   check */.  Pgno
31450 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20   pgnoRoot,      
31460 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20      /* Look for 
31470 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
31480 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
31490 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75  BtCursor *pExclu
314a0 64 65 2c 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72  de,     /* Ignor
314b0 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
314c0 0a 20 20 69 36 34 20 69 52 6f 77 20 20 20 20 20  .  i64 iRow     
314d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
314e0 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
314f0 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
31500 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
31510 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
31520 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
31530 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
31540 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20   = pBtree->db;. 
31550 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31560 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
31570 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72  pBtree) );.  for
31580 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
31590 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
315a0 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63  .    if( p==pExc
315b0 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lude ) continue;
315c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
315d0 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
315e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
315f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
31600 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20  NCRBLOB.    if( 
31610 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  p->isIncrblobHan
31620 64 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20 20  dle && ( .      
31630 20 20 20 28 21 70 45 78 63 6c 75 64 65 20 26 26     (!pExclude &&
31640 20 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20   iRow).      || 
31650 28 70 45 78 63 6c 75 64 65 20 26 26 20 21 70 45  (pExclude && !pE
31660 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c  xclude->isIncrbl
31670 6f 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69  obHandle && p->i
31680 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a  nfo.nKey==iRow).
31690 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d      )){.      p-
316a0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
316b0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a  _INVALID;.    }.
316c0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
316d0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
316e0 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75  _VALID ) continu
316f0 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72  e;.    if( p->wr
31700 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66  Flag==0 .#ifndef
31710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
31720 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d  RBLOB.     || p-
31730 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
31740 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a  e.#endif.    ){.
31750 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
31760 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72  bOther = p->pBtr
31770 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 61 73  ee->db;.      as
31780 73 65 72 74 28 64 62 4f 74 68 65 72 29 3b 0a 20  sert(dbOther);. 
31790 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72       if( dbOther
317a0 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72  !=db && (dbOther
317b0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
317c0 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
317d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
317e0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
317f0 6e 42 6c 6f 63 6b 65 64 28 64 62 2c 20 64 62 4f  nBlocked(db, dbO
31800 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ther);.        r
31810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
31820 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
31830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31840 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
31850 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
31860 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
31870 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
31880 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
31890 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
318a0 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
318b0 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
318c0 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
318d0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
318e0 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
318f0 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
31900 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
31910 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
31920 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
31930 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
31940 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
31950 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
31960 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
31970 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
31980 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
31990 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
319a0 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
319b0 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
319c0 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
319d0 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
319e0 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
319f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65  **.** If the see
31a00 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65  kResult paramete
31a10 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
31a20 68 65 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c  hen a successful
31a30 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
31a40 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29  te3BtreeMoveto()
31a50 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20   to seek cursor 
31a60 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e  pCur to (pKey, n
31a70 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79  Key) has already
31a80 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d  .** been perform
31a90 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69  ed. seekResult i
31aa0 73 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73  s the search res
31ab0 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61 20  ult returned (a 
31ac0 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62  negative.** numb
31ad0 65 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  er if pCur point
31ae0 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  s at an entry th
31af0 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  at is smaller th
31b00 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c  an (pKey, nKey),
31b10 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76   or.** a positiv
31b20 65 20 76 61 6c 75 65 20 69 66 20 70 43 75 72 20  e value if pCur 
31b30 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72  points at an etr
31b40 79 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  y that is larger
31b50 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c   than .** (pKey,
31b60 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20   nKey)). .**.** 
31b70 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
31b80 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  t parameter is 0
31b90 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43  , then cursor pC
31ba0 75 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ur may point to 
31bb0 61 6e 79 20 0a 2a 2a 20 65 6e 74 72 79 20 6f 72  any .** entry or
31bc0 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20   to no entry at 
31bd0 61 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  all. In this cas
31be0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
31bf0 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74  has to seek.** t
31c00 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65  he cursor before
31c10 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e   the new key can
31c20 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
31c30 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
31c40 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
31c50 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
31c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
31c70 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
31c80 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
31c90 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
31ca0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
31cb0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
31cc0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
31cd0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
31ce0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
31cf0 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
31d00 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
31d10 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
31d20 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
31d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d40 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
31d50 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
31d60 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
31d70 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20  int appendBias, 
31d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31d90 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
31da0 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
31db0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b  nd */.  int seek
31dc0 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
31dd0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
31de0 20 6f 66 20 70 72 69 6f 72 20 73 71 6c 69 74 65   of prior sqlite
31df0 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 63  3BtreeMoveto() c
31e00 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  all */.){.  int 
31e10 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20  rc;.  int loc = 
31e20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69 6e  seekResult;.  in
31e30 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t szNew;.  int i
31e40 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
31e50 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
31e60 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
31e70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
31e80 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
31e90 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
31ea0 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
31eb0 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
31ec0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
31ed0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
31ee0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
31ef0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
31f00 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
31f10 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  E );.  assert( !
31f20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
31f30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
31f40 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 72 63 20  >wrFlag );.  rc 
31f50 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f  = checkForReadCo
31f60 6e 66 6c 69 63 74 73 28 70 43 75 72 2d 3e 70 42  nflicts(pCur->pB
31f70 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
31f80 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79  Root, pCur, nKey
31f90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20 20  );.  if( rc ){  
31fa0 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
31fb0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
31fc0 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
31fd0 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
31fe0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
31ff0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
32000 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20  REDCACHE );.    
32010 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
32020 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
32030 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
32040 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
32050 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20  ur->skip;.  }.. 
32060 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
32070 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
32080 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
32090 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a   on this table..
320a0 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d    **.  ** In som
320b0 65 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  e cases, the cal
320c0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
320d0 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20  eMoveto() below 
320e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a  is a no-op. For.
320f0 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68    ** example, wh
32100 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74  en inserting dat
32110 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77  a into a table w
32120 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74  ith auto-generat
32130 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  ed integer.  ** 
32140 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c  keys, the VDBE l
32150 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c  ayer invokes sql
32160 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20  ite3BtreeLast() 
32170 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  to figure out th
32180 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  e .  ** integer 
32190 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74  key to use. It t
321a0 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66  hen calls this f
321b0 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61  unction to actua
321c0 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a  lly insert the .
321d0 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74    ** data into t
321e0 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  he intkey B-Tree
321f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73  . In this case s
32200 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
32210 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20  o() recognizes. 
32220 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72   ** that the cur
32230 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 77  sor is already w
32240 68 65 72 65 20 69 74 20 6e 65 65 64 73 20 74 6f  here it needs to
32250 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20   be and returns 
32260 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69  without.  ** doi
32270 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20  ng any work. To 
32280 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e 67 20  avoid thwarting 
32290 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  these optimizati
322a0 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  ons, it is impor
322b0 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  tant.  ** not to
322c0 20 63 6c 65 61 72 20 74 68 65 20 63 75 72 73 6f   clear the curso
322d0 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  r here..  */.  i
322e0 66 28 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  f(.    SQLITE_OK
322f0 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
32300 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
32310 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
32320 29 29 20 7c 7c 20 28 21 6c 6f 63 20 26 26 0a 20  )) || (!loc &&. 
32330 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
32340 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
32350 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65  Moveto(pCur, pKe
32360 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  y, nKey, appendB
32370 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 29  ias, &loc)).  ))
32380 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
32390 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
323a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
323b0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
323c0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
323d0 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
323e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
323f0 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
32400 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52  ->intKey );.  TR
32410 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
32420 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
32430 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
32440 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
32450 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
32460 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
32470 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
32480 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
32490 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
324a0 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
324b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
324c0 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61  Init );.  alloca
324d0 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
324e0 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42  ;.  newCell = pB
324f0 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  t->pTmpSpace;.  
32500 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29  if( newCell==0 )
32510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
32520 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c  OMEM;.  rc = fil
32530 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e  lInCell(pPage, n
32540 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b  ewCell, pKey, nK
32550 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ey, pData, nData
32560 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29  , nZero, &szNew)
32570 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
32580 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
32590 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63  assert( szNew==c
325a0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
325b0 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20  , newCell) );.  
325c0 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d  assert( szNew<=M
325d0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
325e0 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75 72   );.  idx = pCur
325f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
32600 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d  age];.  if( loc=
32610 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c  =0 && CURSOR_VAL
32620 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
32630 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c   ){.    u16 szOl
32640 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  d;.    assert( i
32650 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
32660 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
32670 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
32680 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
32690 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
326a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
326b0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c  rt;.    }.    ol
326c0 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
326d0 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
326e0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
326f0 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  af ){.      memc
32700 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43  py(newCell, oldC
32710 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20  ell, 4);.    }. 
32720 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53     szOld = cellS
32730 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c  izePtr(pPage, ol
32740 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d  dCell);.    rc =
32750 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
32760 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
32770 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
32780 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 72 63  d_insert;.    rc
32790 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67   = dropCell(pPag
327a0 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a  e, idx, szOld);.
327b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
327c0 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20  TE_OK ) {.      
327d0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
327e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
327f0 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
32800 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
32810 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
32820 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78  >leaf );.    idx
32830 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
32840 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
32850 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
32860 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
32870 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
32880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
32890 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
328a0 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
328b0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
328c0 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  e, idx, newCell,
328d0 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20   szNew, 0, 0);. 
328e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
328f0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d  ITE_OK || pPage-
32900 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67  >nCell>0 || pPag
32910 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
32920 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72  ;..  /* If no er
32930 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c  ror has occured,
32940 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20   call balance() 
32950 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
32960 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 0a 20 20   overflow and.  
32970 2a 2a 20 6d 6f 76 65 20 74 68 65 20 63 75 72 73  ** move the curs
32980 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  or to point at t
32990 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
329a0 61 62 6c 65 20 28 73 69 6e 63 65 20 62 61 6c 61  able (since bala
329b0 6e 63 65 20 6d 61 79 0a 20 20 2a 2a 20 68 61 76  nce may.  ** hav
329c0 65 20 72 65 61 72 72 61 6e 67 65 64 20 74 68 65  e rearranged the
329d0 20 74 61 62 6c 65 20 69 6e 20 73 75 63 68 20 61   table in such a
329e0 20 77 61 79 20 61 73 20 74 6f 20 69 6e 76 61 6c   way as to inval
329f0 69 64 61 74 65 20 42 74 43 75 72 73 6f 72 2e 61  idate BtCursor.a
32a00 70 50 61 67 65 5b 5d 0a 20 20 2a 2a 20 6f 72 20  pPage[].  ** or 
32a10 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b 5d  BtCursor.aiIdx[]
32a20 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63  )..  **.  ** Exc
32a30 65 70 74 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ept, if all of t
32a40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
32a50 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 68 69 6e   true, do nothin
32a60 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  g:.  **.  **   *
32a70 20 49 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e   Inserting the n
32a80 65 77 20 63 65 6c 6c 20 64 69 64 20 6e 6f 74 20  ew cell did not 
32a90 63 61 75 73 65 20 6f 76 65 72 66 6c 6f 77 2c 0a  cause overflow,.
32aa0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 42 65    **.  **   * Be
32ab0 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74  fore inserting t
32ac0 68 65 20 6e 65 77 20 63 65 6c 6c 20 74 68 65 20  he new cell the 
32ad0 63 75 72 73 6f 72 20 77 61 73 20 70 6f 69 6e 74  cursor was point
32ae0 69 6e 67 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ing at the .  **
32af0 20 20 20 20 20 6c 61 72 67 65 73 74 20 6b 65 79       largest key
32b00 20 69 6e 20 61 6e 20 69 6e 74 6b 65 79 20 42 2d   in an intkey B-
32b10 54 72 65 65 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20  Tree, and.  **. 
32b20 20 2a 2a 20 20 20 2a 20 54 68 65 20 6b 65 79 20   **   * The key 
32b30 76 61 6c 75 65 20 61 73 73 6f 63 69 61 74 65 64  value associated
32b40 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 63 65   with the new ce
32b50 6c 6c 20 69 73 20 6e 6f 77 20 74 68 65 20 6c 61  ll is now the la
32b60 72 67 65 73 74 20 0a 20 20 2a 2a 20 20 20 20 20  rgest .  **     
32b70 69 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 0a 20  in the B-Tree.. 
32b80 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73   **.  ** In this
32b90 20 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72   case the cursor
32ba0 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 6c   can be safely l
32bb0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
32bc0 74 68 65 20 28 6e 65 77 29 20 0a 20 20 2a 2a 20  the (new) .  ** 
32bd0 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75  largest key valu
32be0 65 20 69 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  e in the B-Tree.
32bf0 20 44 6f 69 6e 67 20 73 6f 20 73 70 65 65 64 73   Doing so speeds
32c00 20 75 70 20 69 6e 73 65 72 74 69 6e 67 20 61 20   up inserting a 
32c10 73 65 74 0a 20 20 2a 2a 20 6f 66 20 65 6e 74 72  set.  ** of entr
32c20 69 65 73 20 77 69 74 68 20 69 6e 63 72 65 61 73  ies with increas
32c30 69 6e 67 20 69 6e 74 65 67 65 72 20 6b 65 79 20  ing integer key 
32c40 76 61 6c 75 65 73 20 76 69 61 20 61 20 73 69 6e  values via a sin
32c50 67 6c 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  gle cursor.  ** 
32c60 28 63 6f 6d 65 73 20 75 70 20 77 69 74 68 20 22  (comes up with "
32c70 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20  INSERT INTO ... 
32c80 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74  SELECT ..." stat
32c90 65 6d 65 6e 74 73 29 2c 20 61 73 20 0a 20 20 2a  ements), as .  *
32ca0 2a 20 74 68 65 20 6e 65 78 74 20 69 6e 73 65 72  * the next inser
32cb0 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6e  t operation is n
32cc0 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  ot required to s
32cd0 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  eek the cursor..
32ce0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
32cf0 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
32d00 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  (pPage->nOverflo
32d10 77 20 7c 7c 20 21 70 43 75 72 2d 3e 61 74 4c 61  w || !pCur->atLa
32d20 73 74 20 7c 7c 20 6c 6f 63 3e 3d 30 20 7c 7c 20  st || loc>=0 || 
32d30 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  !pCur->apPage[0]
32d40 2d 3e 69 6e 74 4b 65 79 29 0a 20 20 29 7b 0a 20  ->intKey).  ){. 
32d50 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
32d60 70 43 75 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  pCur, 1);.    if
32d70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32d80 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52  ){.      moveToR
32d90 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  oot(pCur);.    }
32da0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4d 75 73  .  }.  .  /* Mus
32db0 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76 65  t make sure nOve
32dc0 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74 20 74  rflow is reset t
32dd0 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 74  o zero even if t
32de0 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20 20 2a  he balance().  *
32df0 2a 20 66 61 69 6c 73 2e 20 20 49 6e 74 65 72 6e  * fails.  Intern
32e00 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
32e10 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c  e corruption wil
32e20 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 72 77 69  l result otherwi
32e30 73 65 2e 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 61  se. */.  pCur->a
32e40 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
32e50 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  e]->nOverflow = 
32e60 30 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a  0;..end_insert:.
32e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32e80 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
32e90 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
32ea0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
32eb0 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
32ec0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
32ed0 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62 69  inting at a arbi
32ee0 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  trary location..
32ef0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
32f00 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
32f10 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
32f20 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
32f30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
32f40 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e 74 20 69  >iPage];.  int i
32f50 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dx;.  unsigned c
32f60 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
32f70 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  t rc;.  Pgno pgn
32f80 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74  oChild = 0;.  Bt
32f90 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
32fa0 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
32fb0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
32fc0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
32fd0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
32fe0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
32ff0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
33000 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
33010 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
33020 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
33030 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
33040 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20  adOnly );.  if( 
33050 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
33060 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
33070 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
33080 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  kip;.  }.  if( N
33090 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78  EVER(pCur->aiIdx
330a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
330b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 20 29 7b 0a  Page->nCell) ){.
330c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
330d0 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65  E_ERROR;  /* The
330e0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
330f0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68  ointing to anyth
33100 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  ing */.  }.  ass
33110 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61  ert( pCur->wrFla
33120 67 20 29 3b 0a 20 20 72 63 20 3d 20 63 68 65 63  g );.  rc = chec
33130 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74  kForReadConflict
33140 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
33150 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72 2d  oot, pCur, pCur-
33160 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 69  >info.nKey);.  i
33170 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33180 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74   ){.    /* The t
33190 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
331a0 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
331b0 6f 63 6b 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ock */.    asser
331c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f  t( rc==SQLITE_LO
331d0 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
331e0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   );.    return r
331f0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  c;.  }..  /* Res
33200 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
33210 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
33220 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65   (a no-op if the
33230 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69   cursor is not i
33240 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52  n .  ** CURSOR_R
33250 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
33260 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70  ) and save the p
33270 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
33280 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20  other cursors . 
33290 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   ** open on the 
332a0 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e  same table. Then
332b0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
332c0 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65  erWrite() on the
332d0 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20   page.  ** that 
332e0 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  the entry will b
332f0 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a  e deleted from..
33300 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
33310 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72  (rc = restoreCur
33320 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
33330 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
33340 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
33350 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
33360 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30  oRoot, pCur))!=0
33370 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71   ||.    (rc = sq
33380 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33390 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
333a0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  !=0.  ){.    ret
333b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
333c0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c  * Locate the cel
333d0 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70 61 67  l within its pag
333e0 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c  e and leave pCel
333f0 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  l pointing to th
33400 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65  e.  ** data. The
33410 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c   clearCell() cal
33420 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72  l frees any over
33430 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
33440 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
33450 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65   ** cell. The ce
33460 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69  ll itself is sti
33470 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a  ll intact..  */.
33480 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69    idx = pCur->ai
33490 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
334a0 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ;.  pCell = find
334b0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
334c0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
334d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
334e0 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
334f0 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  (pCell);.  }.  r
33500 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
33510 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69  age, pCell);.  i
33520 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
33530 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
33540 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
33550 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
33560 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72   The entry we ar
33570 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74  e about to delet
33580 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20  e is not a leaf 
33590 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a  so if we do not.
335a0 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68      ** do someth
335b0 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  ing we will leav
335c0 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69  e a hole on an i
335d0 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20  nternal page..  
335e0 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20    ** We have to 
335f0 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79  fill the hole by
33600 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c   moving in a cel
33610 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20  l from a leaf.  
33620 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  The.    ** next 
33630 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f  Cell after the o
33640 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ne to be deleted
33650 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
33660 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20  o exist and.    
33670 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20  ** to be a leaf 
33680 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74  so we can use it
33690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43  ..    */.    BtC
336a0 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20  ursor leafCur;. 
336b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61     MemPage *pLea
336c0 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  fPage = 0;..    
336d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
336e0 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f  Next;.    int no
336f0 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67  tUsed;.    unsig
33700 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65  ned char *tempCe
33710 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ll = 0;.    asse
33720 72 74 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  rt( !pPage->intK
33730 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ey );.    sqlite
33740 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72  3BtreeGetTempCur
33750 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43  sor(pCur, &leafC
33760 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ur);.    rc = sq
33770 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26  lite3BtreeNext(&
33780 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65  leafCur, &notUse
33790 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
337a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
337b0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
337c0 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72  ur.aiIdx[leafCur
337d0 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20  .iPage]==0 );.  
337e0 20 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d 20      pLeafPage = 
337f0 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 6c  leafCur.apPage[l
33800 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20  eafCur.iPage];. 
33810 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33820 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61  3PagerWrite(pLea
33830 66 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  fPage->pDbPage);
33840 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
33850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33860 20 20 20 20 20 20 69 6e 74 20 6c 65 61 66 43 75        int leafCu
33870 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 30 3b  rsorInvalid = 0;
33880 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78  .      u16 szNex
33890 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  t;.      TRACE((
338a0 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
338b0 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61  d delete interna
338c0 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63  l from %d replac
338d0 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
338e0 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72  ",.         pCur
338f0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
33900 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66 50 61  e->pgno, pLeafPa
33910 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
33920 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
33930 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  , idx, cellSizeP
33940 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
33950 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  );.      pNext =
33960 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 50   findCell(pLeafP
33970 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  age, 0);.      s
33980 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65  zNext = cellSize
33990 50 74 72 28 70 4c 65 61 66 50 61 67 65 2c 20 70  Ptr(pLeafPage, p
339a0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73  Next);.      ass
339b0 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  ert( MX_CELL_SIZ
339c0 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34  E(pBt)>=szNext+4
339d0 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61   );.      alloca
339e0 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
339f0 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c  ;.      tempCell
33a00 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
33a10 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d  e;.      if( tem
33a20 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
33a30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33a40 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
33a50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33a60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33a70 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
33a80 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 70 4e  l(pPage, idx, pN
33a90 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c  ext-4, szNext+4,
33aa0 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20   tempCell, 0);. 
33ab0 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f       }...      /
33ac0 2a 20 54 68 65 20 22 69 66 22 20 73 74 61 74 65  * The "if" state
33ad0 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e 65 78 74  ment in the next
33ae0 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73 20 63   code block is c
33af0 72 69 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  ritical.  The.  
33b00 20 20 20 20 2a 2a 20 73 6c 69 67 68 74 65 73 74      ** slightest
33b10 20 65 72 72 6f 72 20 69 6e 20 74 68 61 74 20 73   error in that s
33b20 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 61  tatement would a
33b30 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f 20 6f  llow SQLite to o
33b40 70 65 72 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  perate.      ** 
33b50 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74 20 6f  correctly most o
33b60 66 20 74 68 65 20 74 69 6d 65 20 62 75 74 20 70  f the time but p
33b70 72 6f 64 75 63 65 20 76 65 72 79 20 72 61 72 65  roduce very rare
33b80 20 66 61 69 6c 75 72 65 73 2e 20 20 54 6f 0a 20   failures.  To. 
33b90 20 20 20 20 20 2a 2a 20 67 75 61 72 64 20 61 67       ** guard ag
33ba0 61 69 6e 73 74 20 74 68 69 73 2c 20 74 68 65 20  ainst this, the 
33bb0 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
33bc0 20 68 65 6c 70 20 74 6f 20 76 65 72 69 66 79 20   help to verify 
33bd0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  that.      ** th
33be0 65 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74  e "if" statement
33bf0 20 69 73 20 77 65 6c 6c 20 74 65 73 74 65 64 2e   is well tested.
33c00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33c10 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
33c20 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
33c30 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 70 42   pPage->nFree<pB
33c40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
33c50 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3 .             
33c60 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65      && pLeafPage
33c70 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
33c80 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
33c90 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20  ze*2/3 );.      
33ca0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
33cb0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
33cc0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70   pPage->nFree==p
33cd0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
33ce0 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  /3 .            
33cf0 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67       && pLeafPag
33d00 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
33d10 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
33d20 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20  ize*2/3 );.     
33d30 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
33d40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
33d50 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d  & pPage->nFree==
33d60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
33d70 32 2f 33 2b 31 20 0a 20 20 20 20 20 20 20 20 20  2/3+1 .         
33d80 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66          && pLeaf
33d90 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
33da0 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
33db0 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20  leSize*2/3 );.  
33dc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
33dd0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
33de0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
33df0 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  <=pBt->usableSiz
33e00 65 2a 32 2f 33 0a 20 20 20 20 20 20 20 20 20 20  e*2/3.          
33e10 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
33e20 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
33e30 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
33e40 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
33e50 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 50     testcase( (pP
33e60 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
33e70 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65   || (pPage->nFre
33e80 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e > pBt->usableS
33e90 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20 20 20  ize*2/3)).      
33ea0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c             && pL
33eb0 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
33ec0 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74 2d 3e  +szNext == pBt->
33ed0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29  usableSize*2/3 )
33ee0 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70  ;...      if( (p
33ef0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
33f00 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72  0 || (pPage->nFr
33f10 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee > pBt->usable
33f20 53 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a 20 20  Size*2/3)) &&.  
33f30 20 20 20 20 20 20 20 20 28 70 4c 65 61 66 50 61          (pLeafPa
33f40 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
33f50 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
33f60 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20 20 20  Size*2/3).      
33f70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
33f80 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
33f90 65 6e 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  en if the intern
33fa0 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77 20 65  al node is now e
33fb0 69 74 68 65 72 20 6f 76 65 72 66 6c 6f 77 69 6e  ither overflowin
33fc0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  g.        ** or 
33fd0 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 74 68  underfull and th
33fe0 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 6c 6c  e leaf node will
33ff0 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 20 61 66   be underfull af
34000 74 65 72 20 74 68 65 20 6a 75 73 74 20 63 65 6c  ter the just cel
34010 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  l .        ** co
34020 70 69 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  pied to the inte
34030 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64 65 6c  rnal node is del
34040 65 74 65 64 20 66 72 6f 6d 20 69 74 2e 20 54 68  eted from it. Th
34050 69 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 0a  is is a special.
34060 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
34070 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
34080 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 74 6f   to balance() to
34090 20 63 6f 72 72 65 63 74 20 74 68 65 20 69 6e 74   correct the int
340a0 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20 20 20  ernal node.     
340b0 20 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e 67 65     ** may change
340c0 20 74 68 65 20 74 72 65 65 20 73 74 72 75 63 74   the tree struct
340d0 75 72 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ure and invalida
340e0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
340f0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
34100 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  e leafCur.apPage
34110 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e 61  [] and leafCur.a
34120 69 49 64 78 5b 5d 20 61 72 72 61 79 73 2c 20 77  iIdx[] arrays, w
34130 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 20 20 20  hich will be.   
34140 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20       ** used by 
34150 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 65  the balance() re
34160 71 75 69 72 65 64 20 74 6f 20 63 6f 72 72 65 63  quired to correc
34170 74 20 74 68 65 20 75 6e 64 65 72 66 75 6c 6c 20  t the underfull 
34180 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  leaf.        ** 
34190 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  node..        **
341a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
341b0 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 69 6e 20  formula used in 
341c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
341d0 62 6f 76 65 20 61 72 65 20 62 61 73 65 64 20 6f  bove are based o
341e0 6e 20 66 61 63 65 74 73 20 6f 66 0a 20 20 20 20  n facets of.    
341f0 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74      ** the SQLit
34200 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20 74 68  e file-format th
34210 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  at do not change
34220 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20 20 20   over time..    
34230 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74      */.        t
34240 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
34250 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62  nFree==pBt->usab
34260 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a  leSize*2/3+1 );.
34270 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34280 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72  ( pLeafPage->nFr
34290 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70 42 74  ee+2+szNext==pBt
342a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
342b0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  +1 );.        le
342c0 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20  afCursorInvalid 
342d0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 20 20 20  = 1;.      }    
342e0 20 20 20 20 0a 0a 20 20 20 20 20 20 69 66 28 20      ..      if( 
342f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34300 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34310 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34320 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
34330 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
34340 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
34350 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
34360 61 67 65 2c 20 69 64 78 29 2c 20 70 67 6e 6f 43  age, idx), pgnoC
34370 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 56  hild);.        V
34380 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70  VA_ONLY( pCur->p
34390 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 30  agesShuffled = 0
343a0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
343b0 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30   balance(pCur, 0
343c0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
343d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
343e0 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75 72 73 6f  _OK && leafCurso
343f0 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20 20 20  rInvalid ){.    
34400 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 61 66 2d      /* The leaf-
34410 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e 64 65  node is now unde
34420 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74 68 65  rfull and so the
34430 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62   tree needs to b
34440 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
34450 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65 76 65  balanced. Howeve
34460 72 2c 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  r, the balance()
34470 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
34480 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20  e internal.     
34490 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f 76 65     ** node above
344a0 20 6d 61 79 20 68 61 76 65 20 6d 6f 64 69 66 69   may have modifi
344b0 65 64 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ed the structure
344c0 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61   of the B-Tree a
344d0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  nd.        ** so
344e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
344f0 74 65 6e 74 73 20 6f 66 20 6c 65 61 66 43 75 72  tents of leafCur
34500 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65  .apPage[] and le
34510 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a 20 20  afCur.aiIdx[].  
34520 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74        ** may not
34530 20 62 65 20 74 72 75 73 74 65 64 2e 0a 20 20 20   be trusted..   
34540 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
34550 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
34560 73 69 62 6c 65 20 74 6f 20 63 6f 70 79 20 74 68  sible to copy th
34570 65 20 61 6e 63 65 73 74 72 79 20 66 72 6f 6d 20  e ancestry from 
34580 70 43 75 72 2c 20 61 73 20 74 68 65 20 73 61 6d  pCur, as the sam
34590 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c  e.        ** bal
345a0 61 6e 63 65 28 29 20 63 61 6c 6c 20 68 61 73 20  ance() call has 
345b0 69 6e 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  invalidated the 
345c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d 20 61  pCur->apPage[] a
345d0 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20 20 20 20  nd aiIdx[].     
345e0 20 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 0a 20     ** arrays. . 
345f0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34600 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
34610 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
34620 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e 74 65  ion() below inte
34630 72 6e 61 6c 6c 79 20 73 61 76 65 73 20 74 68 65  rnally saves the
34640 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79   .        ** key
34650 20 74 68 61 74 20 6c 65 61 66 43 75 72 20 69 73   that leafCur is
34660 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
34670 69 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e 74 6c  ing to. Currentl
34680 79 2c 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  y, there.       
34690 20 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f 70 69   ** are two copi
346a0 65 73 20 6f 66 20 74 68 61 74 20 6b 65 79 20 69  es of that key i
346b0 6e 20 74 68 65 20 74 72 65 65 20 2d 20 6f 6e 65  n the tree - one
346c0 20 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 65 61   here on the lea
346d0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  f.        ** pag
346e0 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73 6f 6d  e and one on som
346f0 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
34700 69 6e 20 74 68 65 20 74 72 65 65 2e 20 54 68 65  in the tree. The
34710 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20 20 20   copy on.       
34720 20 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   ** the leaf nod
34730 65 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  e is always the 
34740 6e 65 78 74 20 6b 65 79 20 69 6e 20 74 72 65 65  next key in tree
34750 2d 6f 72 64 65 72 20 61 66 74 65 72 20 74 68 65  -order after the
34760 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70   .        ** cop
34770 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  y on the interna
34780 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68 65 20  l node. So, the 
34790 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
347a0 74 72 65 65 4e 65 78 74 28 29 0a 20 20 20 20 20  treeNext().     
347b0 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65 73 74     ** calls rest
347c0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
347d0 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20 74 68 65  n() to point the
347e0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 63   cursor to the c
347f0 6f 70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  opy.        ** s
34800 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 69 6e 74  tored on the int
34810 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68 65 6e  ernal node, then
34820 20 61 64 76 61 6e 63 65 73 20 74 6f 20 74 68 65   advances to the
34830 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20 20 20   next entry,.   
34840 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 68 61       ** which ha
34850 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
34860 63 6f 70 79 20 6f 66 20 74 68 65 20 6b 65 79 20  copy of the key 
34870 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  on the internal 
34880 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  node..        **
34890 20 4e 65 74 20 65 66 66 65 63 74 3a 20 6c 65 61   Net effect: lea
348a0 66 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  fCur is pointing
348b0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 75 70   back to the dup
348c0 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20 20 20 20  licate cell.    
348d0 20 20 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64      ** that need
348e0 73 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2c  s to be removed,
348f0 20 61 6e 64 20 74 68 65 20 6c 65 61 66 43 75 72   and the leafCur
34900 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a 20 20  .apPage[] and.  
34910 20 20 20 20 20 20 2a 2a 20 6c 65 61 66 43 75 72        ** leafCur
34920 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 20  .aiIdx[] arrays 
34930 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 20 20 20  are correct..   
34940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34950 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f 20 6c  VVA_ONLY( Pgno l
34960 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61 66 50  eafPgno = pLeafP
34970 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 20  age->pgno );.   
34980 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75       rc = saveCu
34990 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26 6c 65  rsorPosition(&le
349a0 61 66 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  afCur);.        
349b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
349c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
349d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
349e0 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
349f0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 20 20  notUsed);.      
34a00 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 65 61    }.        pLea
34a10 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e  fPage = leafCur.
34a20 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69  apPage[leafCur.i
34a30 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 20 20 61  Page];.        a
34a40 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
34a50 45 5f 4f 4b 20 7c 7c 20 70 4c 65 61 66 50 61 67  E_OK || pLeafPag
34a60 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50 67 6e  e->pgno==leafPgn
34a70 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  o );.        ass
34a80 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
34a90 4f 4b 20 7c 7c 20 6c 65 61 66 43 75 72 2e 61 69  OK || leafCur.ai
34aa0 49 64 78 5b 6c 65 61 66 43 75 72 2e 69 50 61 67  Idx[leafCur.iPag
34ab0 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e]==0 );.      }
34ac0 0a 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ..      if( SQLI
34ad0 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20  TE_OK==rc.      
34ae0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
34af0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34b00 72 57 72 69 74 65 28 70 4c 65 61 66 50 61 67 65  rWrite(pLeafPage
34b10 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20 20 20  ->pDbPage)) .   
34b20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 72     ){.        dr
34b30 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50 61 67 65  opCell(pLeafPage
34b40 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20  , 0, szNext);.  
34b50 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
34b60 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53 68 75  leafCur.pagesShu
34b70 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 20  ffled = 0 );.   
34b80 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
34b90 65 28 26 6c 65 61 66 43 75 72 2c 20 30 29 3b 0a  e(&leafCur, 0);.
34ba0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34bb0 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
34bc0 64 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e 70 61  d || !leafCur.pa
34bd0 67 65 73 53 68 75 66 66 6c 65 64 0a 20 20 20 20  gesShuffled.    
34be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
34c00 7c 20 21 70 43 75 72 2d 3e 70 61 67 65 73 53 68  | !pCur->pagesSh
34c10 75 66 66 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  uffled );.      
34c20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
34c30 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54  te3BtreeReleaseT
34c40 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43  empCursor(&leafC
34c50 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
34c60 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
34c70 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
34c80 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
34c90 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ",.       pCur->
34ca0 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
34cb0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20  >pgno));.    rc 
34cc0 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65  = dropCell(pPage
34cd0 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  , idx, cellSizeP
34ce0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
34cf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
34d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34d10 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
34d20 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Cur, 0);.    }. 
34d30 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
34d40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
34d50 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
34d60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
34d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
34d80 20 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62   a new BTree tab
34d90 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  le.  Write into 
34da0 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67  *piTable the pag
34db0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
34dc0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
34dd0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
34de0 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f  **.** The type o
34df0 66 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d  f type is determ
34e00 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67  ined by the flag
34e10 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e  s parameter.  On
34e20 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ly the.** follow
34e30 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c  ing values of fl
34e40 61 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ags are currentl
34e50 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72  y in use.  Other
34e60 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66   values for.** f
34e70 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77  lags might not w
34e80 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42  ork:.**.**     B
34e90 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45  TREE_INTKEY|BTRE
34ea0 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55  E_LEAFDATA     U
34eb0 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c  sed for SQL tabl
34ec0 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65  es with rowid ke
34ed0 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  ys.**     BTREE_
34ee0 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20  ZERODATA        
34ef0 20 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66            Used f
34f00 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a  or SQL indices.*
34f10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
34f20 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
34f30 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
34f40 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
34f50 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
34f60 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
34f70 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
34f80 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20  Pgno pgnoRoot;. 
34f90 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
34fa0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
34fb0 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
34fc0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
34fd0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
34fe0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
34ff0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
35000 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65  adOnly );..#ifde
35010 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
35020 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20  TOVACUUM.  rc = 
35030 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
35040 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
35050 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
35060 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
35070 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
35080 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d  #else.  if( pBt-
35090 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
350a0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65     Pgno pgnoMove
350b0 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61  ;      /* Move a
350c0 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61   page here to ma
350d0 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
350e0 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20  root-page */.   
350f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d   MemPage *pPageM
35100 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65  ove; /* The page
35110 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a   to move to. */.
35120 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67  .    /* Creating
35130 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79   a new table may
35140 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72   probably requir
35150 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73  e moving an exis
35160 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20  ting database.  
35170 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f    ** to make roo
35180 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  m for the new ta
35190 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20  bles root page. 
351a0 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61 67  In case this pag
351b0 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f  e turns.    ** o
351c0 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72  ut to be an over
351d0 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74  flow page, delet
351e0 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70  e all overflow p
351f0 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20  age-map caches. 
35200 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70     ** held by op
35210 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20  en cursors..    
35220 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  */.    invalidat
35230 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
35240 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  e(pBt);..    /* 
35250 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
35260 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74  f meta[3] from t
35270 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
35280 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74  etermine where t
35290 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
352a0 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
352b0 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20  able should go. 
352c0 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c  meta[3] is the l
352d0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
352e0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
352f0 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e  so far, so the n
35300 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  ew root-page is 
35310 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20  (meta[3]+1)..   
35320 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
35330 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
35340 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74  (p, 4, &pgnoRoot
35350 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
35360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35380 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b   }.    pgnoRoot+
35390 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e  +;..    /* The n
353a0 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79  ew root-page may
353b0 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
353c0 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d  d on a pointer-m
353d0 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a  ap page, or the.
353e0 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
353f0 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  YTE page..    */
35400 0a 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f  .    while( pgno
35410 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47  Root==PTRMAP_PAG
35420 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  ENO(pBt, pgnoRoo
35430 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67  t) ||.        pg
35440 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f  noRoot==PENDING_
35450 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
35460 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74  {.      pgnoRoot
35470 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ++;.    }.    as
35480 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d  sert( pgnoRoot>=
35490 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  3 );..    /* All
354a0 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68  ocate a page. Th
354b0 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72  e page that curr
354c0 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74  ently resides at
354d0 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20   pgnoRoot will. 
354e0 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74     ** be moved t
354f0 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
35500 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65  page (unless the
35510 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
35520 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74  happens.    ** t
35530 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f  o reside at pgno
35540 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  Root)..    */.  
35550 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
35560 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
35570 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d  PageMove, &pgnoM
35580 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31  ove, pgnoRoot, 1
35590 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
355a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
355b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
355c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   }..    if( pgno
355d0 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Move!=pgnoRoot )
355e0 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52  {.      /* pgnoR
355f0 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65 20  oot is the page 
35600 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
35610 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  d for the root-p
35620 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  age of.      ** 
35630 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61  the new table (a
35640 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72  ssuming an error
35650 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e   did not occur).
35660 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20 20   But we were.   
35670 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
35680 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71  pgnoMove. If req
35690 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69  uired (i.e. if i
356a0 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  t was not alloca
356b0 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  ted.      ** by 
356c0 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69  extending the fi
356d0 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74  le), the current
356e0 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f   page at positio
356f0 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20  n pgnoMove.     
35700 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a   ** is already j
35710 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20  ournaled..      
35720 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  */.      u8 eTyp
35730 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50  e;.      Pgno iP
35740 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72  trPage;..      r
35750 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
35760 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Move);..      /*
35770 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 63   Move the page c
35780 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f  urrently at pgno
35790 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65  Root to pgnoMove
357a0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
357b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
357c0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  age(pBt, pgnoRoo
357d0 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20  t, &pRoot, 0);. 
357e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
357f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35810 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
35820 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70  ptrmapGet(pBt, p
35830 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c  gnoRoot, &eType,
35840 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
35850 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35860 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50  E_OK || eType==P
35870 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c  TRMAP_ROOTPAGE |
35880 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
35890 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
358a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
358b0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
358c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
358d0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
358e0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
358f0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20  OOTPAGE );.     
35900 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
35910 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
35920 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  );.      rc = re
35930 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
35940 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50  pRoot, eType, iP
35950 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65  trPage, pgnoMove
35960 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  , 0);.      rele
35970 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
35980 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
35990 20 74 68 65 20 70 61 67 65 20 61 74 20 70 67 6e   the page at pgn
359a0 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69  oRoot */.      i
359b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
359c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
359d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
359e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
359f0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
35a00 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
35a10 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  oot, 0);.      i
35a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35a30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
35a40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
35a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35a60 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
35a70 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
35a80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35a90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35aa0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
35ab0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
35ac0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
35ad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35ae0 70 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76  pRoot = pPageMov
35af0 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f  e;.    } ..    /
35b00 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69  * Update the poi
35b10 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74  nter-map and met
35b20 61 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20  a-data with the 
35b30 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  new root-page nu
35b40 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20  mber. */.    rc 
35b50 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
35b60 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41   pgnoRoot, PTRMA
35b70 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a  P_ROOTPAGE, 0);.
35b80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
35b90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35ba0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65  pRoot);.      re
35bb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
35bc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
35bd0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
35be0 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a  , 4, pgnoRoot);.
35bf0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
35c00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35c10 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65  pRoot);.      re
35c20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
35c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
35c40 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
35c50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c  age(pBt, &pRoot,
35c60 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30   &pgnoRoot, 1, 0
35c70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
35c80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
35c90 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
35ca0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
35cb0 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70  iteable(pRoot->p
35cc0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72  DbPage) );.  zer
35cd0 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61  oPage(pRoot, fla
35ce0 67 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a  gs | PTF_LEAF);.
35cf0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
35d00 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ref(pRoot->pDbPa
35d10 67 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20  ge);.  *piTable 
35d20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b  = (int)pgnoRoot;
35d30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35d40 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
35d50 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
35d60 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
35d70 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66   *piTable, int f
35d80 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
35d90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
35da0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
35db0 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
35dc0 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61  (p, piTable, fla
35dd0 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
35de0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
35df0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
35e00 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76  ** Erase the giv
35e10 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
35e20 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69   and all its chi
35e30 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a  ldren.  Return.*
35e40 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  * the page to th
35e50 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73  e freelist..*/.s
35e60 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44  tatic int clearD
35e70 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42  atabasePage(.  B
35e80 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
35e90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
35ea0 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Tree that contai
35eb0 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ns the table */.
35ec0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
35ed0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
35ee0 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20  number to clear 
35ef0 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67  */.  int freePag
35f00 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a 20 44 65  eFlag,     /* De
35f10 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66  allocate page if
35f20 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   true */.  int *
35f30 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65  pnChange.){.  Me
35f40 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
35f50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
35f60 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
35f70 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ll;.  int i;..  
35f80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35f90 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
35fa0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
35fb0 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  pgno>pagerPageco
35fc0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
35fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
35fe0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
35ff0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
36000 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
36010 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
36020 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
36030 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
36040 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
36050 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
36060 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  ){.    pCell = f
36070 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
36080 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
36090 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
360a0 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
360b0 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
360c0 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c  4byte(pCell), 1,
360d0 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20   pnChange);.    
360e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
360f0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
36100 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
36110 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
36120 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
36130 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
36140 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
36150 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
36160 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
36170 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
36180 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
36190 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
361a0 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c  e->aData[8]), 1,
361b0 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20   pnChange);.    
361c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
361d0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
361e0 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  out;.  }else if(
361f0 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a 20 20 20   pnChange ){.   
36200 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
36210 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70  intKey );.    *p
36220 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50 61 67 65  nChange += pPage
36230 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69  ->nCell;.  }.  i
36240 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20  f( freePageFlag 
36250 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
36260 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
36270 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73  else if( (rc = s
36280 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36290 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
362a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f  )==0 ){.    zero
362b0 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
362c0 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54  e->aData[0] | PT
362d0 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c  F_LEAF);.  }..cl
362e0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
362f0 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
36300 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
36310 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36320 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f   Delete all info
36330 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73  rmation from a s
36340 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
36350 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54  he database.  iT
36360 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70  able is.** the p
36370 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
36380 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
36390 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73  ble.  After this
363a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
363b0 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  ,.** the root pa
363c0 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74  ge is empty, but
363d0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a   still exists..*
363e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
363f0 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
36400 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
36410 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
36420 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72  open.** read cur
36430 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
36440 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63  e.  Open write c
36450 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64  ursors are moved
36460 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   to the.** root 
36470 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
36480 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e 67 65 20  .** If pnChange 
36490 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
364a0 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 6d  n table iTable m
364b0 75 73 74 20 62 65 20 61 6e 20 69 6e 74 6b 65 79  ust be an intkey
364c0 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 69   table. The.** i
364d0 6e 74 65 67 65 72 20 76 61 6c 75 65 20 70 6f 69  nteger value poi
364e0 6e 74 65 64 20 74 6f 20 62 79 20 70 6e 43 68 61  nted to by pnCha
364f0 6e 67 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  nge is increment
36500 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
36510 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69   of.** entries i
36520 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
36530 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
36540 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65  ClearTable(Btree
36550 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
36560 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 29 7b   int *pnChange){
36570 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
36580 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
36590 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
365a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
365b0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
365c0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
365d0 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 63 68  ;.  if( (rc = ch
365e0 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69  eckForReadConfli
365f0 63 74 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  cts(p, iTable, 0
36600 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , 1))!=SQLITE_OK
36610 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
36620 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
36630 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  lse if( SQLITE_O
36640 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c  K!=(rc = saveAll
36650 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61  Cursors(pBt, iTa
36660 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  ble, 0)) ){.    
36670 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
36680 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
36690 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
366a0 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67  asePage(pBt, (Pg
366b0 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 70 6e  no)iTable, 0, pn
366c0 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 73  Change);.  }.  s
366d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
366e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
366f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
36700 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
36710 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20   in a table and 
36720 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  add the root of 
36730 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20  the table to.** 
36740 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45  the freelist.  E
36750 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20  xcept, the root 
36760 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65  of the principle
36770 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20   table (the one 
36780 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73  on.** page 1) is
36790 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20   never added to 
367a0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
367b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
367c0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
367d0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
367e0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
367f0 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  pen.** cursors o
36800 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
36810 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
36820 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20   is enabled and 
36830 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62  the page at iTab
36840 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  le is not the la
36850 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  st.** root page 
36860 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
36870 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c  file, then the l
36880 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a  ast root page .*
36890 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
368a0 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20  e file is moved 
368b0 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f  into the slot fo
368c0 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
368d0 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64  by.** iTable and
368e0 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20   that last slot 
368f0 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
36900 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f  d by the last ro
36910 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64  ot page.** is ad
36920 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
36930 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ist instead of i
36940 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20  Table.  In this 
36950 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  say, all.** root
36960 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20   pages are kept 
36970 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
36980 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
36990 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20   file, which.** 
369a0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
369b0 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77   AUTOVACUUM to w
369c0 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d  ork right.  *piM
369d0 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74  oved is set to t
369e0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  he .** page numb
369f0 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20  er that used to 
36a00 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  be the last root
36a10 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
36a20 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  e before.** the 
36a30 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67  move.  If no pag
36a40 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70  e gets moved, *p
36a50 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
36a60 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20   0..** The last 
36a70 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63  root page is rec
36a80 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d  orded in meta[3]
36a90 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
36aa0 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20  f.** meta[3] is 
36ab0 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20  updated by this 
36ac0 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74  procedure..*/.st
36ad0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 44 72  atic int btreeDr
36ae0 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
36af0 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 69  , Pgno iTable, i
36b00 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
36b10 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
36b20 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
36b30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
36b40 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
36b50 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
36b60 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
36b70 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
36b80 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
36b90 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  E );..  /* It is
36ba0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70   illegal to drop
36bb0 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20   a table if any 
36bc0 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e  cursors are open
36bd0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
36be0 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62  abase. This is b
36bf0 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76  ecause in auto-v
36c00 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62  acuum mode the b
36c10 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20  ackend may.  ** 
36c20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f  need to move ano
36c30 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74  ther root-page t
36c40 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66  o fill a gap lef
36c50 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64  t by the deleted
36c60 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e  .  ** root page.
36c70 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   If an open curs
36c80 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 69  or was using thi
36c90 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d  s page a problem
36ca0 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63   would .  ** occ
36cb0 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ur..  */.  if( p
36cc0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Bt->pCursor ){. 
36cd0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
36ce0 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
36cf0 62 2c 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 2d  b, pBt->pCursor-
36d00 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
36d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36d20 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
36d30 48 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  HE;.  }..  rc = 
36d40 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
36d50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
36d60 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30  Table, &pPage, 0
36d70 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
36d80 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
36d90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
36da0 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65  rTable(p, iTable
36db0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
36dc0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
36dd0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
36de0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
36df0 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20  *piMoved = 0;.. 
36e00 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b   if( iTable>1 ){
36e10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
36e20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
36e30 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
36e40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c  (pPage);.    rel
36e50 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
36e60 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
36e70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
36e80 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78  {.      Pgno max
36e90 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
36ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
36eb0 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
36ec0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
36ed0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36ef0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
36f00 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ge);.        ret
36f10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
36f20 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c  .      if( iTabl
36f30 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29  e==maxRootPgno )
36f40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
36f50 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
36f60 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74  dropped is the t
36f70 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61  able with the la
36f80 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
36f90 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
36fa0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
36fb0 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20  e, put the root 
36fc0 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
36fd0 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20   list. .        
36fe0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
36ff0 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
37000 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
37010 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
37020 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
37030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37040 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
37050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
37070 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
37080 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f   dropped does no
37090 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65  t have the large
370a0 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
370b0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
370c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
370d0 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  So move the page
370e0 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20   that does into 
370f0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
37100 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
37110 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67  deleted root-pag
37120 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
37130 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
37140 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65  Move;.        re
37150 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
37160 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
37170 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
37180 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
37190 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
371a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
371b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
371c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
371d0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
371e0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
371f0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76  tePage(pBt, pMov
37200 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e, PTRMAP_ROOTPA
37210 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30  GE, 0, iTable, 0
37220 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
37230 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
37240 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37260 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37280 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
37290 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
372a0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
372b0 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
372c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
372d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
372e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
372f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
37300 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76   = freePage(pMov
37310 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
37320 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
37330 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
37340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37350 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
37360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37370 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d      *piMoved = m
37380 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
37390 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
373a0 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72  t the new 'max-r
373b0 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20  oot-page' value 
373c0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
373d0 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20  header. This.   
373e0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64     ** is the old
373f0 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c   value less one,
37400 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69   less one more i
37410 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74  f that happens t
37420 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20  o.      ** be a 
37430 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
37440 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e  , less one again
37450 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a   if that is the.
37460 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47        ** PENDING
37470 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20  _BYTE_PAGE..    
37480 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f    */.      maxRo
37490 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
374a0 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
374b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
374c0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
374d0 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
374e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
374f0 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
37500 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
37510 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  Bt, maxRootPgno)
37520 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
37530 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
37540 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
37550 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45   maxRootPgno!=PE
37560 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
37570 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72  pBt) );..      r
37580 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
37590 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
375a0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20   maxRootPgno);. 
375b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
375c0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
375d0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  age);.      rele
375e0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
375f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
37600 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
37610 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
37620 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64  Table was called
37630 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
37640 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
37650 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  e, PTF_INTKEY|PT
37660 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65  F_LEAF );.    re
37670 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
37680 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37690 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  c;  .}.int sqlit
376a0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
376b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
376c0 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
376d0 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
376e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
376f0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
37700 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c  treeDropTable(p,
37710 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64   iTable, piMoved
37720 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
37730 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
37740 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
37750 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d  * Read the meta-
37760 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
37770 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
37780 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  le.  Meta[0].** 
37790 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
377a0 20 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72   free pages curr
377b0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74  ently in the dat
377c0 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a  abase.  Meta[1].
377d0 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b  ** through meta[
377e0 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c  15] are availabl
377f0 65 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67  e for use by hig
37800 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74  her layers.  Met
37810 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d  a[0].** is read-
37820 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73  only, the others
37830 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
37840 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65  .** .** The sche
37850 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73  ma layer numbers
37860 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66   meta values dif
37870 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68  ferently.  At th
37880 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65  e schema.** laye
37890 72 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f  r (and the SetCo
378a0 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f  okie and ReadCoo
378b0 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65  kie opcodes) the
378c0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72   number of.** fr
378d0 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20  ee pages is not 
378e0 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f  visible.  So Coo
378f0 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61  kie[0] is the sa
37900 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a  me as Meta[1]..*
37910 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
37920 65 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20  eeGetMeta(Btree 
37930 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  *p, int idx, u32
37940 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61   *pMeta){.  DbPa
37950 67 65 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b  ge *pDbPage = 0;
37960 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
37970 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
37980 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
37990 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
379a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
379b0 70 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e  p);..  /* Readin
379c0 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61  g a meta-data va
379d0 6c 75 65 20 72 65 71 75 69 72 65 73 20 61 20 72  lue requires a r
379e0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65  ead-lock on page
379f0 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20   1 (and hence.  
37a00 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
37a10 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67  ster table. We g
37a20 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65  rab this lock re
37a30 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
37a40 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20  her or.  ** not 
37a50 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55  the SQLITE_ReadU
37a60 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
37a70 69 73 20 73 65 74 20 28 74 68 65 20 74 61 62 6c  is set (the tabl
37a80 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
37a90 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74  .  ** 1 is treat
37aa0 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  ed as a special 
37ab0 63 61 73 65 20 62 79 20 71 75 65 72 79 53 68 61  case by querySha
37ac0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
37ad0 6b 28 29 0a 20 20 2a 2a 20 61 6e 64 20 73 65 74  k().  ** and set
37ae0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
37af0 4c 6f 63 6b 28 29 29 2e 0a 20 20 2a 2f 0a 20 20  Lock())..  */.  
37b00 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
37b10 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
37b20 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
37b30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
37b40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
37b50 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
37b60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
37b70 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
37b80 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31  idx>=0 && idx<=1
37b90 35 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  5 );.  if( pBt->
37ba0 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a  pPage1 ){.    /*
37bb0 20 54 68 65 20 62 2d 74 72 65 65 20 69 73 20 61   The b-tree is a
37bc0 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61  lready holding a
37bd0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
37be0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
37bf0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
37c00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
37c10 68 65 20 72 65 71 75 69 72 65 64 20 6d 65 74 61  he required meta
37c20 2d 64 61 74 61 20 76 61 6c 75 65 20 63 61 6e 20  -data value can 
37c30 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
37c40 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
37c50 20 70 61 67 65 20 64 61 74 61 20 6f 66 20 74 68   page data of th
37c60 69 73 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  is reference. Th
37c70 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66  is is slightly f
37c80 61 73 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  aster than.    *
37c90 2a 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 6e  * requesting a n
37ca0 65 77 20 72 65 66 65 72 65 6e 63 65 20 66 72 6f  ew reference fro
37cb0 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
37cc0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  r..    */.    pP
37cd0 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  1 = (unsigned ch
37ce0 61 72 20 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  ar *)pBt->pPage1
37cf0 2d 3e 61 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65  ->aData;.  }else
37d00 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74  {.    /* The b-t
37d10 72 65 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ree does not hav
37d20 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
37d30 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
37d40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
37d50 20 20 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e 65 20    ** Obtain one 
37d60 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
37d70 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ayer..    */.   
37d80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37d90 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
37da0 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b  r, 1, &pDbPage);
37db0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
37dc0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
37dd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
37de0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37df0 7d 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73  }.    pP1 = (uns
37e00 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
37e10 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
37e20 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
37e30 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79   *pMeta = get4by
37e40 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
37e50 2a 34 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  *4]);..  /* If t
37e60 68 65 20 62 2d 74 72 65 65 20 69 73 20 6e 6f 74  he b-tree is not
37e70 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
37e80 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 2c 20  ence to page 1, 
37e90 74 68 65 6e 20 6f 6e 65 20 77 61 73 20 0a 20 20  then one was .  
37ea0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
37eb0 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
37ec0 72 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 62  r in the above b
37ed0 6c 6f 63 6b 2e 20 52 65 6c 65 61 73 65 20 69 74  lock. Release it
37ee0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
37ef0 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b   !pBt->pPage1 ){
37f00 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
37f10 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
37f20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 75  .  }..  /* If au
37f30 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69  tovacuumed is di
37f40 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  sabled in this b
37f50 75 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20  uild but we are 
37f60 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20  trying to .  ** 
37f70 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61  access an autova
37f80 63 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c  cuumed database,
37f90 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64   then make the d
37fa0 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79  atabase readonly
37fb0 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  . .  */.#ifdef S
37fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
37fd0 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d  ACUUM.  if( idx=
37fe0 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29  =4 && *pMeta>0 )
37ff0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
38000 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   1;.#endif..  /*
38010 20 49 66 20 74 68 65 72 65 20 69 73 20 63 75 72   If there is cur
38020 72 65 6e 74 6c 79 20 61 6e 20 6f 70 65 6e 20 74  rently an open t
38030 72 61 6e 73 61 63 74 69 6f 6e 2c 20 67 72 61 62  ransaction, grab
38040 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 20 20   a read-lock .  
38050 2a 2a 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 20  ** on page 1 of 
38060 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
38070 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  e. This is done 
38080 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
38090 74 0a 20 20 2a 2a 20 6e 6f 20 6f 74 68 65 72 20  t.  ** no other 
380a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6d  connection can m
380b0 6f 64 69 66 79 20 74 68 65 20 6d 65 74 61 20 76  odify the meta v
380c0 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 66  alue just read f
380d0 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  rom.  ** the dat
380e0 61 62 61 73 65 20 75 6e 74 69 6c 20 74 68 65 20  abase until the 
380f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
38100 6f 6e 63 6c 75 64 65 64 2e 0a 20 20 2a 2f 0a 20  oncluded..  */. 
38110 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
38120 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  0 ){.    rc = se
38130 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
38140 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44  eLock(p, 1, READ
38150 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 73 71  _LOCK);.  }.  sq
38160 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
38170 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
38180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
38190 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
381a0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
381b0 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30  atabase.  Meta[0
381c0 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c  ] is.** read-onl
381d0 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65  y and may not be
381e0 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74   written..*/.int
381f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
38200 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70  ateMeta(Btree *p
38210 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69  , int idx, u32 i
38220 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65  Meta){.  BtShare
38230 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
38240 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
38250 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b   *pP1;.  int rc;
38260 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
38270 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  1 && idx<=15 );.
38280 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
38290 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
382a0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
382b0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
382c0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
382d0 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d  e1!=0 );.  pP1 =
382e0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
382f0 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
38300 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
38310 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
38320 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
38330 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
38340 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  put4byte(&pP1[36
38350 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61   + idx*4], iMeta
38360 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
38370 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
38380 4d 0a 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37  M.    if( idx==7
38390 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
383a0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
383b0 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b  m || iMeta==0 );
383c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
383d0 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61  Meta==0 || iMeta
383e0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ==1 );.      pBt
383f0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
38400 75 38 29 69 4d 65 74 61 3b 0a 20 20 20 20 7d 0a  u8)iMeta;.    }.
38410 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
38420 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
38430 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
38440 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
38450 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74  the flag byte at
38460 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
38470 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
38480 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  the cursor.** is
38490 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
384a0 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  ing to..*/.int s
384b0 71 6c 69 74 65 33 42 74 7