/ Hex Artifact Content
Login

Artifact 3e831426631f0eff0b56d7980ba39cfc53911727:


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 35 38 36 20 32 30 30 39 2f 30  c,v 1.586 2009/0
0190: 34 2f 30 31 20 31 38 3a 30 33 3a 30 31 20 64 61  4/01 18:03:01 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 2f 0a  ee handle p..*/.
1fd0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
1fe0: 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
1ff0: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
2000: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
2010: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2020: 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72   BtLock **ppIter
2030: 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a   = &pBt->pLock;.
2040: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2050: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2060: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2070: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c  ( p->sharable ||
2080: 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 0a   0==*ppIter );..
2090: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
20a0: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
20b0: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
20c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
20d0: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
20e0: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
20f0: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2100: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
2110: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2120: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
2130: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
2140: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2150: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  pLock);.    }els
2160: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
2170: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
2180: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
2190: 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e  sert( pBt->isPen
21a0: 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  ding==0 || pBt->
21b0: 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28  pWriter );.  if(
21c0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
21d0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72   ){.    pBt->pWr
21e0: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
21f0: 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
2200: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   0;.    pBt->isP
2210: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65  ending = 0;.  }e
2220: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
2230: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
2240: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
2250: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
2260: 68 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  hen connection p
2270: 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69   is concluding i
2280: 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ts .    ** trans
2290: 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65  action. If there
22a0: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
22b0: 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20  s a writer, and 
22c0: 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  p is not.    ** 
22d0: 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65  that writer, the
22e0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
22f0: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
2300: 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a  nnections other.
2310: 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20      ** than the 
2320: 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61  writer must be a
2330: 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20  bout to drop to 
2340: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
2350: 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  se.    ** set th
2360: 65 20 69 73 50 65 6e 64 69 6e 67 20 66 6c 61 67  e isPending flag
2370: 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20   to 0..    **.  
2380: 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
2390: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
23a0: 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42 74   writer, then Bt
23b0: 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67  Shared.isPending
23c0: 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
23d0: 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f  zero already. So
23e0: 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20   this next line 
23f0: 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74  is harmless in t
2400: 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  hat case..    */
2410: 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64  .    pBt->isPend
2420: 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  ing = 0;.  }.}.#
2430: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2440: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2450: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
2460: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
2470: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
2480: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
2490: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56  ence */../*.** V
24a0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
24b0: 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75  ursor holds a mu
24c0: 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
24d0: 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  red.*/.#ifndef N
24e0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
24f0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2500: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
2510: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2520: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
2530: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  Bt->mutex);.}.#e
2540: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
2550: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
2560: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  LOB./*.** Invali
2570: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
2580: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
2590: 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75  e for cursor pCu
25a0: 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74  r, if any..*/.st
25b0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
25c0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
25d0: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
25e0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
25f0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2600: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
2610: 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
2620: 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e  rflow);.  pCur->
2630: 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d  aOverflow = 0;.}
2640: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
2650: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
2660: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
2670: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
2680: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
2690: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
26a0: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
26b0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
26c0: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
26d0: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
26e0: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
26f0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
2700: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2710: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2720: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
2730: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
2740: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61  pNext){.    inva
2750: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
2760: 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  che(p);.  }.}.#e
2770: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  lse.  #define in
2780: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
2790: 43 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69  Cache(x).  #defi
27a0: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  ne invalidateAll
27b0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29  OverflowCache(x)
27c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
27d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
27e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
27f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
2800: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
2810: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
2820: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
2830: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
2840: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
2850: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
2860: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
2870: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
2880: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
2890: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
28a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
28b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
28c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
28d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
28e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
28f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
2900: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
2910: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
2920: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
2930: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
2940: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
2950: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
2960: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
2970: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2980: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2990: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
29a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
29b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
29c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
29d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
29e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
29f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
2a00: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
2a10: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
2a20: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
2a30: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
2a40: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
2a50: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
2a60: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
2a70: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
2a80: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
2a90: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
2aa0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2ab0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
2ac0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ad0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
2ae0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
2af0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
2b00: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
2b10: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
2b20: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
2b30: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
2b40: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
2b50: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
2b60: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
2b70: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
2b80: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
2b90: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
2ba0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
2bb0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
2bc0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
2bd0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
2be0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
2bf0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
2c00: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
2c10: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
2c20: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
2c30: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
2c40: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
2c50: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
2c60: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
2c70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
2c80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
2c90: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
2ca0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
2cb0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
2cc0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
2cd0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
2ce0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
2cf0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
2d00: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
2d10: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
2d20: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
2d30: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
2d40: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
2d50: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
2d60: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
2d70: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
2d80: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
2d90: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2da0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
2db0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
2dc0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
2dd0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
2de0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
2df0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
2e00: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
2e10: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
2e20: 69 73 20 6f 6d 6d 69 74 74 65 64 20 69 66 20 74  is ommitted if t
2e30: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2e40: 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a   bit is already.
2e50: 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72  ** set in BtShar
2e60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20  ed.pHasContent. 
2e70: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2e80: 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63  the bitvec are c
2e90: 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65  leared.** at the
2ea0: 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72   end of every tr
2eb0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
2ec0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65  atic int btreeSe
2ed0: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
2ee0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
2ef0: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20  pgno){.  int rc 
2f00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2f10: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
2f20: 74 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tent ){.    int 
2f30: 6e 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d 20  nPage;.    rc = 
2f40: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2f50: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
2f60: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
2f70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f80: 4b 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  K ){.      pBt->
2f90: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
2fa0: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
2fb0: 65 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a 20  e((u32)nPage);. 
2fc0: 20 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70       if( !pBt->p
2fd0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
2fe0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ff0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
3000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
3010: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
3020: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
3030: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
3040: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
3050: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
3060: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
3070: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
3080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
3090: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
30a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
30b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
30c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
30d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
30e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
30f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
3100: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
3110: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
3120: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
3130: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
3140: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
3150: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
3160: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
3170: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
3180: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
3190: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
31a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
31b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
31c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
31d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
31e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
31f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
3200: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
3210: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
3220: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
3230: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
3240: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
3250: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
3260: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
3270: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
3280: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
3290: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
32a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
32b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
32c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
32d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
32e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
32f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
3300: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
3310: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
3320: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
3330: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
3340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  ;.}../*.** Save 
3350: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
3360: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
3370: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
3380: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
3390: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
33a0: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
33b0: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
33c0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
33d0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
33e0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
33f0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
3400: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
3410: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
3420: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
3430: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
3440: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
3450: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
3460: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
3470: 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ur) );..  rc = s
3480: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
3490: 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e  ze(pCur, &pCur->
34a0: 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nKey);..  /* If 
34b0: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65  this is an intKe
34c0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
34d0: 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20  e above call to 
34e0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20  BtreeKeySize(). 
34f0: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69   ** stores the i
3500: 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43  nteger key in pC
3510: 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69  ur->nKey. In thi
3520: 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75  s case this valu
3530: 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  e is.  ** all th
3540: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  at is required. 
3550: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
3560: 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f  ur is not open o
3570: 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a  n an intKey.  **
3580: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c   table, then mal
3590: 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e  loc space for an
35a0: 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72  d store the pCur
35b0: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20  ->nKey bytes of 
35c0: 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a  key .  ** data..
35d0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
35e0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70  QLITE_OK && 0==p
35f0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
3600: 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69  intKey){.    voi
3610: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
3620: 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43  3Malloc( (int)pC
3630: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
3640: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
3650: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
3660: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
3670: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
3680: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
3690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
36b0: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
36c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
36e0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
36f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3700: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
3710: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
3720: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
3730: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
3740: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
3750: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
3760: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
3770: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
3780: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
3790: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
37a0: 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
37b0: 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
37c0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
37d0: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
37e0: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
37f0: 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  1;.    pCur->eSt
3800: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
3810: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
3820: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3830: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
3840: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3850: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
3860: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
3870: 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70  cursors except p
3880: 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74  Except open on t
3890: 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74  he table .** wit
38a0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
38b0: 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  t. Usually, this
38c0: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
38d0: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a  before cursor.**
38e0: 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64   pExcept is used
38f0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74   to modify the t
3900: 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74  able (BtreeDelet
3910: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
3920: 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rt())..*/.static
3930: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
3940: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
3950: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
3960: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
3970: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3980: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3990: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
39a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
39b0: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
39c0: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
39d0: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
39e0: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
39f0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3a00: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
3a10: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
3a20: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
3a30: 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20  =iRoot) && .    
3a40: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43      p->eState==C
3a50: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
3a60: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
3a70: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
3a80: 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  (p);.      if( S
3a90: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
3aa0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
3ab0: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
3ac0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3ad0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3ae0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
3af0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
3b00: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3b10: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
3b20: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
3b30: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
3b40: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
3b50: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
3b60: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
3b70: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
3b80: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
3b90: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
3ba0: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
3bb0: 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
3bc0: 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69  rsor to the posi
3bd0: 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28  tion it was in (
3be0: 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61  or as close to a
3bf0: 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77  s possible).** w
3c00: 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f  hen saveCursorPo
3c10: 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c  sition() was cal
3c20: 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  led. Note that t
3c30: 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73  his call deletes
3c40: 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70   the .** saved p
3c50: 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f  osition info sto
3c60: 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f  red by saveCurso
3c70: 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20  rPosition(), so 
3c80: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
3c90: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65  at most one effe
3ca0: 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72  ctive restoreCur
3cb0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61  sorPosition() ca
3cc0: 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a  ll after each .*
3cd0: 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  * saveCursorPosi
3ce0: 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  tion()..*/.int s
3cf0: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
3d00: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
3d10: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
3d20: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
3d30: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
3d40: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
3d50: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
3d60: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
3d70: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
3d80: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
3d90: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
3da0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
3db0: 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70  r->skip;.  }.  p
3dc0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
3dd0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
3de0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
3df0: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43  eMoveto(pCur, pC
3e00: 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e  ur->pKey, pCur->
3e10: 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e  nKey, 0, &pCur->
3e20: 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d  skip);.  if( rc=
3e30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3e40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3e50: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
3e60: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
3e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
3e80: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
3e90: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
3ea0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
3eb0: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
3ec0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
3ed0: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
3ee0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
3ef0: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
3f00: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
3f10: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73  K ? \.         s
3f20: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
3f30: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
3f40: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
3f50: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
3f60: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
3f70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
3f80: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
3f90: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
3fa0: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
3fb0: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
3fc0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
3fd0: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
3fe0: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
3ff0: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
4000: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
4010: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4020: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
4030: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
4040: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4050: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
4060: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
4070: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
4080: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
4090: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
40a0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
40b0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
40c0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
40d0: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
40e0: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
40f0: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
4100: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
4110: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
4120: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
4130: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
4140: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
4150: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
4160: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
4170: 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20  ->skip!=0 ){.   
4180: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
4190: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
41a0: 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
41b0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
41c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
41d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
41e0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
41f0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
4200: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
4210: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
4220: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
4230: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
4240: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
4250: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
4260: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
4270: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
4280: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
4290: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
42a0: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
42b0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
42c0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
42d0: 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Page;.  Pgno iPt
42e0: 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73  rMap, ret;.  ass
42f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4300: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
4310: 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50  ex) );.  nPagesP
4320: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
4330: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
4340: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
4350: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
4360: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
4370: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
4380: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
4390: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
43a0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
43b0: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
43c0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
43d0: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
43e0: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
43f0: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
4400: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
4410: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
4420: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
4430: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
4440: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
4450: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
4460: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
4470: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
4480: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41  ber 'pgno'..** A
4490: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
44a0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
44b0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
44c0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
44d0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
44e0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42   int ptrmapPut(B
44f0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4500: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
4510: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a  , Pgno parent){.
4520: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
4530: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
4540: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
4550: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
4560: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
4570: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
4580: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
4590: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
45a0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
45b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
45c0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
45d0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
45e0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
45f0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
4600: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4610: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
4620: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
4630: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
4640: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
4650: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
4660: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
4670: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
4680: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
4690: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
46a0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
46b0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
46c0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
46d0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey==0 ){.    ret
46e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
46f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
4700: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
4710: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
4720: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
4730: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
4740: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
4750: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
4760: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
4770: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
4780: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
4790: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
47a0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
47b0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
47c0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
47d0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
47e0: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
47f0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
4800: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
4810: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
4820: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
4830: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
4840: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
4850: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
4860: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
4870: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
4880: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
4890: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
48a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
48b0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
48c0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
48d0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
48e0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
48f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
4900: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
4910: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74  (pDbPage);.  ret
4920: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4930: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
4940: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
4950: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
4960: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
4970: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
4980: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
4990: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
49a0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
49b0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
49c0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
49d0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
49e0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
49f0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
4a00: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
4a10: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
4a20: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
4a30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4a40: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
4a50: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
4a60: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
4a70: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
4a80: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
4a90: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
4aa0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
4ab0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
4ac0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
4ad0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
4ae0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
4af0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
4b00: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
4b10: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
4b20: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
4b30: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
4b40: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
4b50: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
4b60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
4b70: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
4b80: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
4b90: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
4ba0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
4bb0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
4bc0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
4bd0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
4be0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
4bf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
4c00: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
4c10: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
4c20: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
4c30: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
4c40: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
4c50: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61  trmap, key);.  a
4c60: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
4c70: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
4c80: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
4c90: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
4ca0: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
4cb0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
4cc0: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
4cd0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
4ce0: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
4cf0: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
4d00: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
4d10: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
4d20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4d30: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
4d40: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
4d50: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
4d60: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
4d70: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
4d80: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
4d90: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
4da0: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
4db0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
4dc0: 6d 61 70 50 75 74 4f 76 66 6c 28 79 2c 7a 29 20  mapPutOvfl(y,z) 
4dd0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
4de0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
4df0: 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61  btree page and a
4e00: 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d   cell index (0 m
4e10: 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63  eans the first c
4e20: 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  ell on.** the pa
4e30: 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20  ge, 1 means the 
4e40: 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64  second cell, and
4e50: 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72   so forth) retur
4e60: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
4e70: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
4e80: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
4e90: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c  outine works onl
4ea0: 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74  y for pages that
4eb0: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
4ec0: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
4ed0: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  */.#define findC
4ee0: 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  ell(P,I) \.  ((P
4ef0: 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d  )->aData + ((P)-
4f00: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
4f10: 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61  byte(&(P)->aData
4f20: 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  [(P)->cellOffset
4f30: 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a  +2*(I)])))../*.*
4f40: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
4f50: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
4f60: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
4f70: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
4f80: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
4f90: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
4fa0: 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a  ls.  See insert.
4fb0: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
4fc0: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
4fd0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
4fe0: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
4ff0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   i;.  assert( sq
5000: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5010: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
5020: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
5030: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
5040: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
5050: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
5060: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
5070: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
5080: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
5090: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
50a0: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
50b0: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
50c0: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
50d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
50e0: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
50f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
5100: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
5110: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
5120: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
5130: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
5140: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
5150: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
5160: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
5170: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
5180: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
5190: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
51a0: 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42  ction.  sqlite3B
51b0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
51c0: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
51d0: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
51e0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
51f0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
5200: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
5210: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
5220: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
5230: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
5240: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
5250: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
5260: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
5270: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
5280: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
5290: 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  tead of.** sqlit
52a0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
52b0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
52c0: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
52d0: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
52e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
52f0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
5300: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
5310: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
5320: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
5330: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
5340: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
5350: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
5360: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
5370: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
5380: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
5390: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
53a0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
53b0: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
53c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
53d0: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
53e0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
53f0: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
5400: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
5410: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
5420: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
5430: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
5440: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5450: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
5460: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
5470: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
5480: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5490: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
54a0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
54b0: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
54c0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
54d0: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
54e0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
54f0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
5500: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
5510: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
5520: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
5530: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
5540: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
5550: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
5560: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
5570: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
5580: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
5590: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
55a0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
55b0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
55c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
55d0: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
55e0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
55f0: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
5600: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
5610: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
5620: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
5630: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
5640: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
5650: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66  Header = n;.  if
5660: 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61  ( likely(nPayloa
5670: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
5680: 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  al) ){.    /* Th
5690: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
56a0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
56b0: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
56c0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
56d0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
56e0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
56f0: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
5700: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53     */.    int nS
5710: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ize;          /*
5720: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63   Total size of c
5730: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62  ell content in b
5740: 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a  ytes */.    nSiz
5750: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e  e = nPayload + n
5760: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
5770: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
5780: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
5790: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
57a0: 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20     if( (nSize & 
57b0: 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ~3)==0 ){.      
57c0: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
57d0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
57e0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
57f0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
5800: 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69  nSize = (u16)nSi
5810: 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
5820: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
5830: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
5840: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
5850: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
5860: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20   have.    ** to 
5870: 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20  decide how much 
5880: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
5890: 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f   and how much to
58a0: 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20   spill onto.    
58b0: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
58c0: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
58d0: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
58e0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
58f0: 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63  used.    ** spac
5900: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
5910: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
5920: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
5930: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
5940: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
5950: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
5960: 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  Local..    **.  
5970: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
5980: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
5990: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
59a0: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
59b0: 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61  in any.    ** wa
59c0: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
59d0: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
59e0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
59f0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e    */.    int min
5a00: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d  Local;  /* Minim
5a10: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
5a20: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
5a30: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78  y */.    int max
5a40: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
5a50: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
5a60: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
5a70: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72  y */.    int sur
5a80: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
5a90: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
5aa0: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
5ab0: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20  storage */..    
5ac0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
5ad0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
5ae0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
5af0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
5b00: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
5b10: 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  al + (nPayload -
5b20: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
5b30: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
5b40: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28  ze - 4);.    if(
5b50: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
5b60: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49  ocal ){.      pI
5b70: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
5b80: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20  16)surplus;.    
5b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
5ba0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
5bb0: 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  6)minLocal;.    
5bc0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
5bd0: 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70  erflow = (u16)(p
5be0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e  Info->nLocal + n
5bf0: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
5c00: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
5c10: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
5c20: 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43  }.#define parseC
5c30: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
5c40: 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c  , pInfo) \.  sql
5c50: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
5c60: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
5c70: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
5c80: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
5c90: 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  o)).void sqlite3
5ca0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  BtreeParseCell(.
5cb0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
5cc0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
5cd0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
5ce0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
5cf0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
5d00: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
5d10: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
5d20: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
5d30: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
5d40: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
5d50: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
5d60: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
5d70: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
5d80: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
5d90: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
5da0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
5db0: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
5dc0: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
5dd0: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
5de0: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
5df0: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
5e00: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
5e10: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
5e20: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
5e30: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
5e40: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
5e50: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
5e60: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
5e70: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
5e80: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
5e90: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
5ea0: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
5eb0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
5ec0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
5ed0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
5ee0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
5ef0: 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  iCell, &info);. 
5f00: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
5f10: 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61  ze;.}.#endif.sta
5f20: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
5f30: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
5f40: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
5f50: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
5f60: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
5f70: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
5f80: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
5f90: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
5fa0: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  nSize;.}..#ifnde
5fb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5fc0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
5fd0: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
5fe0: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
5ff0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
6000: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
6010: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
6020: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
6030: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
6040: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
6050: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
6060: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
6070: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
6080: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
6090: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c   *pCell){.  Cell
60a0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73  Info info;.  ass
60b0: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
60c0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
60d0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
60e0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
60f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66  ;.  assert( (inf
6100: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
6110: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
6120: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
6130: 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e  oad );.  if( (in
6140: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
6150: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
6160: 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
6170: 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  l ){.    Pgno ov
6180: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
6190: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
61a0: 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  low]);.    retur
61b0: 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  n ptrmapPut(pPag
61c0: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
61d0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
61e0: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
61f0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6200: 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66  E_OK;.}./*.** If
6210: 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69   the cell with i
6220: 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61  ndex iCell on pa
6230: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
6240: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
6250: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
6260: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
6270: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
6280: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
6290: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
62a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
62b0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d   ptrmapPutOvfl(M
62c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
62d0: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20  nt iCell){.  u8 
62e0: 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pCell;.  assert
62f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6300: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
6310: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65  >mutex) );.  pCe
6320: 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  ll = findOverflo
6330: 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  wCell(pPage, iCe
6340: 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74  ll);.  return pt
6350: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
6360: 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a  Page, pCell);.}.
6370: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
6380: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
6390: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
63a0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
63b0: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
63c0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
63d0: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
63e0: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
63f0: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
6400: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
6410: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
6420: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
6430: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
6440: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6450: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
6460: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
6470: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
6480: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64a0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
64b0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
64e0: 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a   a i-th cell */.
64f0: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6510: 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
6520: 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20  byte after cell 
6530: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
6540: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6560: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
6570: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
6580: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
6590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
65a0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
65b0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
65c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
65d0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
65e0: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
65f0: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
6600: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
6610: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
6620: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
6630: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
6640: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
6650: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
6660: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
6670: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
6680: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
6690: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
66a0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
66b0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
66c0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
66d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
66e0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
66f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
6700: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
6710: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
6720: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
6730: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
6740: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
6750: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
6760: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6770: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
6780: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
6790: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
67a0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
67b0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
67c0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
67d0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
67e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
67f0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6800: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
6810: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
6820: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
6830: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
6840: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
6850: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
6860: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
6870: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
6880: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
6890: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
68a0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
68b0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
68c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
68d0: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
68e0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
68f0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
6900: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
6910: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
6920: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
6930: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
6940: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
6950: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
6960: 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d  leSize;.  for(i=
6970: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
6980: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
6990: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
69a0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
69b0: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
69c0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
69d0: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
69e0: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
69f0: 20 20 20 20 69 66 28 20 70 63 3e 3d 75 73 61 62      if( pc>=usab
6a00: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
6a10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6a20: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
6a30: 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  }.    size = cel
6a40: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
6a50: 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20  &temp[pc]);.    
6a60: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20  cbrk -= size;.  
6a70: 20 20 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c 4f    if( cbrk<cellO
6a80: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c 7c  ffset+2*nCell ||
6a90: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
6aa0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
6ab0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
6ac0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
6ad0: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
6ae0: 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65  size<=usableSize
6af0: 20 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a 20   && cbrk>=0 );. 
6b00: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
6b10: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
6b20: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
6b30: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
6b40: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
6b50: 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73  ( cbrk>=cellOffs
6b60: 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  et+2*nCell );.  
6b70: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
6b80: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
6b90: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
6ba0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
6bb0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
6bc0: 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20  ] = 0;.  addr = 
6bd0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
6be0: 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  ll;.  memset(&da
6bf0: 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62 72  ta[addr], 0, cbr
6c00: 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73 73 65 72  k-addr);.  asser
6c10: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
6c20: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
6c30: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6c40: 69 66 28 20 63 62 72 6b 2d 61 64 64 72 21 3d 70  if( cbrk-addr!=p
6c50: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
6c60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6c70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6c80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6c90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6ca0: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
6cb0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72  ytes of space fr
6cc0: 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d  om within the B-
6cd0: 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64  Tree page passed
6ce0: 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
6cf0: 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72   argument. Retur
6d00: 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  n the index into
6d10: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
6d20: 6f 66 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  of the .** first
6d30: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
6d40: 65 64 20 73 70 61 63 65 2e 20 0a 2a 2a 0a 2a 2a  ed space. .**.**
6d50: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
6d60: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 20  antees that the 
6d70: 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 74 68  space between th
6d80: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 65 6c  e end of the cel
6d90: 6c 2d 6f 66 66 73 65 74 20 0a 2a 2a 20 61 72 72  l-offset .** arr
6da0: 61 79 20 61 6e 64 20 74 68 65 20 73 74 61 72 74  ay and the start
6db0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
6dc0: 74 65 6e 74 20 61 72 65 61 20 69 73 20 61 74 20  tent area is at 
6dd0: 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74 65  least nByte byte
6de0: 73 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 53 6f  s.** in size. So
6df0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
6e00: 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a  n never fail..**
6e10: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
6e20: 20 61 6c 72 65 61 64 79 20 36 30 20 6f 72 20 6d   already 60 or m
6e30: 6f 72 65 20 62 79 74 65 73 20 6f 66 20 66 72 61  ore bytes of fra
6e40: 67 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68  gments within th
6e50: 65 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 20 70  e page,.** the p
6e60: 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
6e70: 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  ted before retur
6e80: 6e 69 6e 67 2e 20 49 66 20 74 68 69 73 20 77 65  ning. If this we
6e90: 72 65 20 6e 6f 74 20 64 6f 6e 65 20 74 68 65 72  re not done ther
6ea0: 65 0a 2a 2a 20 69 73 20 61 20 63 68 61 6e 63 65  e.** is a chance
6eb0: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
6ec0: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
6ed0: 79 74 65 73 20 63 6f 75 6c 64 20 65 76 65 6e 74  ytes could event
6ee0: 75 61 6c 6c 79 20 0a 2a 2a 20 6f 76 65 72 66 6c  ually .** overfl
6ef0: 6f 77 20 74 68 65 20 73 69 6e 67 6c 65 2d 62 79  ow the single-by
6f00: 74 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  te field of the 
6f10: 70 61 67 65 2d 68 65 61 64 65 72 20 69 6e 20 77  page-header in w
6f20: 68 69 63 68 20 74 68 69 73 20 76 61 6c 75 65 0a  hich this value.
6f30: 2a 2a 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f  ** is stored..*/
6f40: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
6f50: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
6f60: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
6f70: 79 74 65 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  yte){.  const in
6f80: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
6f90: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
6fa0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
6fb0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
6fc0: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
6fd0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
6fe0: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
6ff0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
7000: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
7010: 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20  t nFrag;        
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7040: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
7050: 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69   on pPage */.  i
7060: 6e 74 20 74 6f 70 3b 0a 20 20 0a 20 20 61 73 73  nt top;.  .  ass
7070: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
7080: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
7090: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
70a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
70b0: 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
70c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
70d0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
70e0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
70f0: 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b  ert( nByte>=0 );
7100: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
7110: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
7120: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7130: 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a  nFree>=nByte );.
7140: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
7150: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
7160: 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
7170: 61 74 20 74 68 65 20 73 70 61 63 65 20 62 65 74  at the space bet
7180: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 2d 6f 66  ween the cell-of
7190: 66 73 65 74 20 61 72 72 61 79 20 61 6e 64 20 74  fset array and t
71a0: 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 2d 63 6f  he .  ** cell-co
71b0: 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 67 72  ntent area is gr
71c0: 65 61 74 65 72 20 74 68 61 6e 20 6e 42 79 74 65  eater than nByte
71d0: 20 62 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20 61   bytes..  */.  a
71e0: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 3d 20  ssert( nByte <= 
71f0: 28 0a 20 20 20 20 20 20 67 65 74 32 62 79 74 65  (.      get2byte
7200: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 2d 28  (&data[hdr+5])-(
7210: 68 64 72 2b 38 2b 28 70 50 61 67 65 2d 3e 6c 65  hdr+8+(pPage->le
7220: 61 66 3f 30 3a 34 29 2b 32 2a 67 65 74 32 62 79  af?0:4)+2*get2by
7230: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
7240: 29 0a 20 20 29 29 3b 0a 0a 20 20 70 50 61 67 65  ).  ));..  pPage
7250: 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
7260: 6e 42 79 74 65 3b 0a 20 20 6e 46 72 61 67 20 3d  nByte;.  nFrag =
7270: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
7280: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b  if( nFrag>=60 ){
7290: 0a 20 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50  .    defragmentP
72a0: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65  age(pPage);.  }e
72b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  lse{.    /* Sear
72c0: 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ch the freelist 
72d0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72  looking for a fr
72e0: 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75  ee slot big enou
72f0: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20  gh to satisfy . 
7300: 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
7310: 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f  t. The allocatio
7320: 6e 20 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74  n is made from t
7330: 68 65 20 66 69 72 73 74 20 66 72 65 65 20 73 6c  he first free sl
7340: 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68  ot in .    ** th
7350: 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c  e list that is l
7360: 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61  arge enough to a
7370: 63 63 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20  ccomadate it..  
7380: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c    */.    int pc,
7390: 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61   addr;.    for(a
73a0: 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d  ddr=hdr+1; (pc =
73b0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
73c0: 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d  addr]))>0; addr=
73d0: 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  pc){.      int s
73e0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
73f0: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20  data[pc+2]);    
7400: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65   /* Size of free
7410: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69   slot */.      i
7420: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
7430: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
7440: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
7450: 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 34 20          if( x<4 
7460: 29 7b 0a 09 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ){..  /* Remove 
7470: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
7480: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
7490: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
74a0: 66 0a 09 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74  f..  ** fragment
74b0: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
74c0: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
74d0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64         memcpy(&d
74e0: 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61  ata[addr], &data
74f0: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
7500: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
7510: 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78  = (u8)(nFrag + x
7520: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
7530: 7b 0a 09 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74  {..  /* The slot
7540: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
7550: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
7560: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
7570: 63 6f 75 6e 74 0a 09 20 20 2a 2a 20 66 6f 72 20  count..  ** for 
7580: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
7590: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
75a0: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
75b0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
75c0: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
75d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
75e0: 20 72 65 74 75 72 6e 20 70 63 20 2b 20 78 3b 0a   return pc + x;.
75f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7600: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
7610: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
7620: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
7630: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
7640: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
7650: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
7660: 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f   area..  */.  to
7670: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
7680: 74 61 5b 68 64 72 2b 35 5d 29 20 2d 20 6e 42 79  ta[hdr+5]) - nBy
7690: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
76a0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
76b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b  );.  return top;
76c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
76d0: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
76e0: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
76f0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
7700: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
7710: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
7720: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
7730: 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a  ->aDisk[start].*
7740: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
7750: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22  f the block is "
7760: 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a  size" bytes..**.
7770: 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65  ** Most of the e
7780: 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e  ffort here is in
7790: 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73  volved in coales
77a0: 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20  ing adjacent.** 
77b0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f  free blocks into
77c0: 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72   a single big fr
77d0: 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  ee block..*/.sta
77e0: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
77f0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
7800: 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74  , int start, int
7810: 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64   size){.  int ad
7820: 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b  dr, pbegin, hdr;
7830: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7840: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
7850: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
7860: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
7870: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7880: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
7890: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
78a0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
78b0: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
78c0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61  hdrOffset+6+(pPa
78d0: 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b  ge->leaf?0:4) );
78e0: 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72  .  assert( (star
78f0: 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65  t + size)<=pPage
7900: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
7910: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
7920: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7930: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
7940: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
7950: 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f  ( size>=0 );   /
7960: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
7970: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66  ize is 4 */..#if
7980: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
7990: 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76  E_DELETE.  /* Ov
79a0: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
79b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
79c0: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
79d0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20  SECURE_DELETE . 
79e0: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
79f0: 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
7a00: 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  -time */.  memse
7a10: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
7a20: 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66  0, size);.#endif
7a30: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73  ..  /* Add the s
7a40: 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74  pace back into t
7a50: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
7a60: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a  f freeblocks */.
7a70: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
7a80: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
7a90: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
7aa0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
7ab0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
7ac0: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
7ad0: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61  begin>0 ){.    a
7ae0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
7af0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7b00: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 69  eSize-4 );.    i
7b10: 66 28 20 70 62 65 67 69 6e 3c 3d 61 64 64 72 20  f( pbegin<=addr 
7b20: 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
7b30: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7b40: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
7b50: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
7b60: 20 7d 0a 20 20 69 66 20 28 20 70 62 65 67 69 6e   }.  if ( pbegin
7b70: 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
7b80: 62 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a 20 20  bleSize-4 ) {.  
7b90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7ba0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7bb0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67  }.  assert( pbeg
7bc0: 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69  in>addr || pbegi
7bd0: 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79  n==0 );.  put2by
7be0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  te(&data[addr], 
7bf0: 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79  start);.  put2by
7c00: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  te(&data[start],
7c10: 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32   pbegin);.  put2
7c20: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
7c30: 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50  +2], size);.  pP
7c40: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 28 75  age->nFree += (u
7c50: 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43  16)size;..  /* C
7c60: 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74  oalesce adjacent
7c70: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a   free blocks */.
7c80: 20 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e    addr = pPage->
7c90: 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20  hdrOffset + 1;. 
7ca0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
7cb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
7cc0: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
7cd0: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
7ce0: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
7cf0: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
7d00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
7d10: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
7d20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
7d30: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
7d40: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
7d50: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
7d60: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7d70: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
7d80: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
7d90: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
7da0: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
7db0: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
7dc0: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
7dd0: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  +psize);.      i
7de0: 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28  f( (frag<0) || (
7df0: 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 70  frag>(int)data[p
7e00: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
7e10: 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  7]) ){.        r
7e20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7e30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
7e40: 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50   }.      data[pP
7e50: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37  age->hdrOffset+7
7e60: 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20  ] -= (u8)frag;. 
7e70: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
7e80: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b  e(&data[pnext]);
7e90: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
7ea0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78  &data[pbegin], x
7eb0: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65  );.      x = pne
7ec0: 78 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  xt + get2byte(&d
7ed0: 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20  ata[pnext+2]) - 
7ee0: 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75  pbegin;.      pu
7ef0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
7f00: 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  gin+2], x);.    
7f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
7f20: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  r = pbegin;.    
7f30: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
7f40: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
7f50: 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68  area begins with
7f60: 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65   a freeblock, re
7f70: 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66  move it. */.  if
7f80: 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64  ( data[hdr+1]==d
7f90: 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61  ata[hdr+5] && da
7fa0: 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b  ta[hdr+2]==data[
7fb0: 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e  hdr+6] ){.    in
7fc0: 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69  t top;.    pbegi
7fd0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
7fe0: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
7ff0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72  memcpy(&data[hdr
8000: 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69  +1], &data[pbegi
8010: 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20  n], 2);.    top 
8020: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8030: 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62  [hdr+5]) + get2b
8040: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
8050: 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79  +2]);.    put2by
8060: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
8070: 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73   top);.  }.  ass
8080: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
8090: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
80a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
80b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
80c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
80d0: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
80e0: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
80f0: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
8100: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
8110: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
8120: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
8130: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
8140: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
8150: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
8160: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
8170: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
8180: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
8190: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
81a0: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
81b0: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
81c0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
81d0: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
81e0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
81f0: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
8200: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
8210: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
8220: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
8230: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
8240: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
8250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
8260: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
8270: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
8280: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
8290: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
82a0: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
82b0: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
82c0: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
82d0: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
82e0: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
82f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8300: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8310: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8320: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
8330: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
8340: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
8350: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
8360: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
8370: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
8380: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8390: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
83a0: 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20  ->leaf;.  pBt = 
83b0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
83c0: 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46  ( flagByte==(PTF
83d0: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
83e0: 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70  INTKEY) ){.    p
83f0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
8400: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
8410: 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
8420: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
8430: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
8440: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
8450: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
8460: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
8470: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
8480: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
8490: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
84a0: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Key = 0;.    pPa
84b0: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b  ge->hasData = 0;
84c0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
84d0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
84e0: 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
84f0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
8500: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  >minLocal;.  }el
8510: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
8520: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8530: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
8540: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8550: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
8560: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
8570: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
8580: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
8590: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
85a0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
85b0: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
85c0: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
85d0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
85e0: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
85f0: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
8600: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
8610: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
8620: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
8630: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
8640: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
8650: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
8660: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
8670: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
8680: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
8690: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
86a0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ruption..*/.int 
86b0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
86c0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
86d0: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
86e0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
86f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
8700: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8710: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
8720: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8730: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
8740: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
8750: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
8760: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
8770: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
8780: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
8790: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
87a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
87b0: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
87c0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
87d0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
87e0: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
87f0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
8800: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
8810: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
8820: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
8830: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
8840: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
8850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8860: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
8870: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
8880: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
8890: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
88a0: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
88b0: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
88c0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
88d0: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
88e0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
88f0: 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c 65 53  .    u16 usableS
8900: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
8910: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
8920: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
8930: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
8940: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
8950: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
8960: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
8970: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
8980: 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20 20 20     u16 nFree;   
8990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
89a0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
89b0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
89c0: 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20 20 20     u16 top;     
89d0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
89e0: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
89f0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
8a00: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
8a10: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
8a20: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
8a30: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
8a40: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
8a50: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
8a60: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
8a70: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
8a80: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8a90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
8aa0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
8ab0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
8ac0: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70  <=32768 );.    p
8ad0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
8ae0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
8af0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   1;.    pPage->n
8b00: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
8b10: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
8b20: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
8b30: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
8b40: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
8b50: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
8b60: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
8b70: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
8b80: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
8b90: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
8ba0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
8bb0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
8bc0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
8bd0: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
8be0: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
8bf0: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
8c00: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
8c10: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
8c20: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
8c30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8c40: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
8c50: 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74    .    /* Comput
8c60: 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
8c70: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
8c80: 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67  ge */.    pc = g
8c90: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
8ca0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65  r+1]);.    nFree
8cb0: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
8cc0: 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73   top - (cellOffs
8cd0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
8ce0: 65 6c 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ell);.    while(
8cf0: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
8d00: 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
8d10: 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62       if( pc>usab
8d20: 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20  leSize-4 ){.    
8d30: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
8d40: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67  k is off the pag
8d50: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
8d60: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8d70: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
8d80: 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
8d90: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
8da0: 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
8db0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8dc0: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
8dd0: 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74  ( next>0 && next
8de0: 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20  <=pc+size+3 ){. 
8df0: 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62         /* Free b
8e00: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
8e10: 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
8e20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
8e30: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8e40: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
8e50: 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20  .      nFree += 
8e60: 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d  size;.      pc =
8e70: 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20   next;.    }.   
8e80: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
8e90: 28 75 31 36 29 6e 46 72 65 65 3b 0a 20 20 20 20  (u16)nFree;.    
8ea0: 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c  if( nFree>=usabl
8eb0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
8ec0: 2a 20 46 72 65 65 20 73 70 61 63 65 20 63 61 6e  * Free space can
8ed0: 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c  not exceed total
8ee0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
8ef0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8f00: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
8f10: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  .    }..#if 0.  
8f20: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c  /* Check that al
8f30: 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20 69 6e  l the offsets in
8f40: 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65 74   the cell offset
8f50: 20 61 72 72 61 79 20 61 72 65 20 77 69 74 68 69   array are withi
8f60: 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a  n range. .  ** .
8f70: 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74 68    ** Omitting th
8f80: 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63  is consistency c
8f90: 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67 20 74  heck and using t
8fa0: 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  he pPage->maskPa
8fb0: 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f 20  ge mask.  ** to 
8fc0: 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75 6e 6e  prevent overrunn
8fd0: 69 6e 67 20 74 68 65 20 70 61 67 65 20 62 75 66  ing the page buf
8fe0: 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c 28  fer in findCell(
8ff0: 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61 0a 20  ) results in a. 
9000: 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f 72 6d   ** 2.5% perform
9010: 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a  ance gain..  */.
9020: 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66 66    {.    u8 *pOff
9030: 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72  ;        /* Iter
9040: 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63 68 65  ator used to che
9050: 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66 73  ck all cell offs
9060: 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e 67 65  ets are in range
9070: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   */.    u8 *pEnd
9080: 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ;        /* Poin
9090: 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20 63 65  ter to end of ce
90a0: 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20  ll offset array 
90b0: 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b 20  */.    u8 mask; 
90c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
90d0: 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d 75 73  of bits that mus
90e0: 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53 42  t be zero in MSB
90f0: 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 73   of cell offsets
9100: 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20 7e   */.    mask = ~
9110: 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  (((u8)(pBt->page
9120: 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20  Size>>8))-1);.  
9130: 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63    pEnd = &data[c
9140: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50 61 67  ellOffset + pPag
9150: 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20  e->nCell*2];.   
9160: 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74 61 5b   for(pOff=&data[
9170: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f 66  cellOffset]; pOf
9180: 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28 2a 70  f!=pEnd && !((*p
9190: 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66 66  Off)&mask); pOff
91a0: 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  +=2);.    if( pO
91b0: 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  ff!=pEnd ){.    
91c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
91e0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
91f0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
9200: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
9210: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9220: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
9230: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
9240: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
9250: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
9260: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
9270: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
9280: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
9290: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
92a0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
92b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
92c0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
92d0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
92e0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
92f0: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
9300: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
9310: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
9320: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9330: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
9340: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
9350: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
9360: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9370: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
9380: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
9390: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
93a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
93b0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
93c0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
93d0: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
93e0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
93f0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9400: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
9410: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9420: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
9430: 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65  ex) );.  /*memse
9440: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
9450: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
9460: 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74   - hdr);*/.  dat
9470: 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
9480: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
9490: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
94a0: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
94b0: 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74   ?1:0);.  memset
94c0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
94d0: 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
94e0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
94f0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
9500: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
9510: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
9520: 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee = pBt->usable
9530: 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20  Size - first;.  
9540: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
9550: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
9560: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
9570: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
9580: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
9590: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
95a0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
95b0: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
95c0: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
95d0: 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29  ageSize<=32768 )
95e0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
95f0: 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  age = pBt->pageS
9600: 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65  ize - 1;.  pPage
9610: 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
9620: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
9630: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
9640: 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
9650: 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
9660: 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
9670: 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
9680: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
9690: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
96a0: 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
96b0: 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
96c0: 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
96d0: 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
96e0: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
96f0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
9700: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
9710: 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
9720: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
9730: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
9740: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
9750: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
9760: 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67   pDbPage;.  pPag
9770: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
9780: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
9790: 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
97a0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
97b0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
97c0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  0;.  return pPag
97d0: 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
97e0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
97f0: 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
9800: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
9810: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
9820: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
9830: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  s if needed..**.
9840: 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74  ** If the noCont
9850: 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ent flag is set,
9860: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
9870: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
9880: 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  out.** the conte
9890: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
98a0: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
98b0: 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
98c0: 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
98d0: 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
98e0: 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
98f0: 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
9900: 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
9910: 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
9920: 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
9930: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
9940: 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
9950: 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
9960: 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
9970: 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
9980: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
9990: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
99a0: 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
99b0: 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  t point..*/.int 
99c0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
99d0: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
99e0: 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
99f0: 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
9a00: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
9a10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9a20: 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
9a30: 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
9a40: 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
9a50: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
9a60: 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
9a70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
9a80: 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ent        /* Do
9a90: 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63   not load page c
9aa0: 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a  ontent if true *
9ab0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
9ac0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
9ad0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
9ae0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9af0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9b00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
9b10: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
9b20: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
9b30: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
9b40: 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69   noContent);.  i
9b50: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9b60: 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
9b70: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
9b80: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
9b90: 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
9ba0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9bb0: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
9bc0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
9bd0: 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
9be0: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
9bf0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
9c00: 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
9c10: 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
9c20: 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
9c30: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
9c40: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
9c50: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
9c60: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
9c70: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
9c80: 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
9c90: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
9ca0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
9cb0: 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
9cc0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9cd0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
9ce0: 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
9cf0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
9d00: 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
9d10: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
9d20: 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
9d30: 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
9d40: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
9d50: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
9d60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
9d70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9d80: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
9d90: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
9da0: 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
9db0: 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
9dc0: 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
9dd0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
9de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
9df0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42  pagerPagecount(B
9e00: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
9e10: 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b   int nPage = -1;
9e20: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
9e30: 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
9e40: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
9e50: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
9e60: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
9e70: 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
9e80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
9e90: 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20  | nPage==-1 );. 
9ea0: 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50   return (Pgno)nP
9eb0: 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  age;.}../*.** Ge
9ec0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
9ed0: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
9ee0: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
9ef0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a   routine.** is j
9f00: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63  ust a convenienc
9f10: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
9f20: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
9f30: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
9f40: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
9f50: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
9f60: 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
9f70: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
9f80: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
9f90: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
9fa0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
9fb0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
9fc0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
9fd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
9fe0: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
9ff0: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
a000: 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e     /* Write t
a010: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
a020: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
a030: 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
a040: 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
a050: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a060: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
a070: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   );.  if( pgno==
a080: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a090: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a0a0: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20  KPT; .  }..  /* 
a0b0: 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20  It is often the 
a0c0: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 70 61  case that the pa
a0d0: 67 65 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c  ge we want is al
a0e0: 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a  ready in cache..
a0f0: 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20    ** If so, get 
a100: 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  it directly.  Th
a110: 69 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d  is saves us from
a120: 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a   having to call.
a130: 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f    ** pagerPageco
a140: 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75  unt() to make su
a150: 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69  re pgno is withi
a160: 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20  n limits, which 
a170: 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20  results.  ** in 
a180: 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65  a measureable pe
a190: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
a1a0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a  ements..  */.  *
a1b0: 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d  ppPage = pPage =
a1c0: 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
a1d0: 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  (pBt, pgno);.  i
a1e0: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
a1f0: 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72 65 61  /* Page is alrea
a200: 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  dy in cache */. 
a210: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
a220: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
a230: 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e 20 63  /* Page not in c
a240: 61 63 68 65 2e 20 20 41 63 71 75 69 72 65 20 69  ache.  Acquire i
a250: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  t. */.    if( pg
a260: 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
a270: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
a280: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a290: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
a2a0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
a2b0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
a2c0: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
a2d0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
a2e0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
a2f0: 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61     pPage = *ppPa
a300: 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  ge;.  }.  if( !p
a310: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
a320: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a330: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
a340: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  age);.  }.  if( 
a350: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a360: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
a370: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70  (pPage);.    *pp
a380: 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
a390: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a3a0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
a3b0: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
a3c0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
a3d0: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
a3e0: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c  r.** call to sql
a3f0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
a400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a410: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
a420: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
a430: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
a440: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a450: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
a460: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
a470: 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e  Refcount(pPage->
a480: 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20  pDbPage)>1 );.  
a490: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a4a0: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
a4b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a4c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a4d0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
a4e0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
a4f0: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
a500: 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Page );.    asse
a510: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
a520: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
a530: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
a540: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
a550: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a560: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a570: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a580: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
a590: 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ref(pPage->pDbPa
a5a0: 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
a5b0: 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
a5c0: 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
a5d0: 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
a5e0: 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
a5f0: 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
a600: 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
a610: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
a620: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
a630: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
a640: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a650: 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
a660: 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
a670: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
a680: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
a690: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
a6a0: 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
a6b0: 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
a6c0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
a6d0: 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
a6e0: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
a6f0: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
a700: 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
a710: 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20  bPage *pData){. 
a720: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
a730: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
a740: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
a750: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
a760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a770: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
a780: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
a790: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
a7a0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
a7b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a7c0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a7d0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a7e0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
a7f0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
a800: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
a810: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29  count(pData)>1 )
a820: 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  {.      /* pPage
a830: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20   might not be a 
a840: 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20  btree page;  it 
a850: 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72  might be an over
a860: 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
a870: 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67  ** or ptrmap pag
a880: 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65  e or a free page
a890: 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65  .  In those case
a8a0: 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
a8b0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
a8c0: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  o sqlite3BtreeIn
a8d0: 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
a8e0: 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
a8f0: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
a900: 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
a910: 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
a920: 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
a930: 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
a940: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
a950: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
a960: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
a970: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
a980: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
a990: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
a9a0: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
a9b0: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
a9c0: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
a9d0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
a9e0: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
a9f0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
aa00: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
aa10: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
aa20: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
aa30: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
aa40: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
aa50: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
aa60: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
aa70: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
aa80: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
aa90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
aaa0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
aab0: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
aac0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
aad0: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
aae0: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
aaf0: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
ab00: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
ab10: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
ab20: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
ab30: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
ab40: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
ab50: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
ab60: 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61  LL.** a new data
ab70: 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64  base with a rand
ab80: 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74  om name is creat
ab90: 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d  ed.  This random
aba0: 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61  ly named.** data
abb0: 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62  base file will b
abc0: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73  e deleted when s
abd0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
abe0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
abf0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
ac00: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
ac10: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
ac20: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
ac30: 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
ac40: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
ac50: 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
ac60: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
ac70: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
ac80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ac90: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
aca0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
acb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
acc0: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
acd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
ace0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
acf0: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
ad00: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
ad10: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
ad20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
ad30: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
ad40: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
ad50: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ad70: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
ad80: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
ad90: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
ada0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
adb0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
adc0: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  en() */.){.  sql
add0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
adf0: 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  he VFS to use fo
ae00: 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a  r this btree */.
ae10: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
ae20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ae30: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
ae40: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
ae50: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
ae60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ae70: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
ae80: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
ae90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
aea0: 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
aeb0: 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
aec0: 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
aed0: 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
aee0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
aef0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
af00: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
af10: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
af20: 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
af30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
af40: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
af50: 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
af60: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
af70: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
af80: 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
af90: 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
afa0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
afb0: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
afc0: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
afd0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
afe0: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
aff0: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
b000: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
b010: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
b020: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
b030: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
b040: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
b050: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
b060: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
b070: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
b080: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
b090: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
b0a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b0b0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
b0c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b0d0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b0e0: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
b0f0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
b100: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
b110: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
b120: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
b130: 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65   isMemdb = zFile
b140: 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28  name && !strcmp(
b150: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
b160: 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66  ory:");.  #endif
b170: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
b180: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
b190: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b1a0: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
b1b0: 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d  ex) );..  pVfs =
b1c0: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d   db->pVfs;.  p =
b1d0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
b1e0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
b1f0: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
b200: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b210: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
b220: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
b230: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
b240: 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e   db;..#if !defin
b250: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
b260: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
b270: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b280: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
b290: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
b2a0: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
b2b0: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
b2c0: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
b2d0: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
b2e0: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
b2f0: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
b300: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
b310: 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20   if( isMemdb==0 
b320: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  && zFilename && 
b330: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
b340: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
b350: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
b360: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
b370: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
b380: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
b390: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
b3a0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
b3b0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
b3c0: 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50  te3Malloc(nFullP
b3d0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
b3e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
b3f0: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
b400: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
b410: 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  1;.      db->fla
b420: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61  gs |= SQLITE_Sha
b430: 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20  redCache;.      
b440: 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
b450: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
b460: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
b470: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b480: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
b490: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b4a0: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
b4b0: 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
b4c0: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
b4d0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
b4e0: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
b4f0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
b500: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
b510: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
b520: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
b530: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
b540: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
b550: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
b560: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
b570: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
b580: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
b590: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
b5a0: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
b5b0: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
b5c0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
b5d0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
b5e0: 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
b5f0: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
b600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
b610: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
b620: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
b630: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
b640: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
b650: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
b660: 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  er)).           
b670: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
b680: 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
b690: 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
b6a0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
b6b0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
b6c0: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
b6d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b6e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b6f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
b700: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
b710: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
b720: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
b730: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
b740: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
b750: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
b760: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
b770: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
b780: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
b790: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
b7a0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
b7b0: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
b7c0: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
b7d0: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
b7e0: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
b7f0: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
b800: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
b810: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
b820: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
b830: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
b840: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
b850: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
b860: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
b870: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
b880: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
b890: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
b8a0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
b8b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
b8c0: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
b8d0: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
b8e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
b8f0: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
b900: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
b910: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
b920: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
b930: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
b940: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
b950: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
b960: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
b970: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
b980: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
b990: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
b9a0: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
b9b0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
b9c0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
b9d0: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
b9e0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
b9f0: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
ba00: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
ba10: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
ba20: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
ba30: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
ba40: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
ba50: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
ba60: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
ba70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
ba80: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
ba90: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
baa0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
bab0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
bac0: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
bad0: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
bae0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
bb10: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
bb20: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bb30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bb40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
bb50: 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
bb60: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
bb70: 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
bb80: 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
bb90: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
bba0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
bbb0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
bbc0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
bbd0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
bbe0: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
bbf0: 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
bc00: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
bc10: 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
bc20: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73   = pBt;.  .    s
bc30: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
bc40: 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67  initer(pBt->pPag
bc50: 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  er, pageReinit);
bc60: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
bc70: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
bc80: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
bc90: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
bca0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
bcb0: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
bcc0: 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  er);.    pBt->pa
bcd0: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
bce0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  e(&zDbHeader[16]
bcf0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
bd00: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
bd10: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
bd20: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
bd30: 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
bd40: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
bd50: 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
bd60: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
bd70: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
bd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
bd90: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
bda0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
bdb0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e  >pageSize);.#ifn
bdc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bdd0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
bde0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
bdf0: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
be00: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
be10: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
be20: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
be30: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
be40: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
be50: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
be60: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
be70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
be80: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
be90: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
bea0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
beb0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
bec0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
bed0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
bee0: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
bef0: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
bf00: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
bf10: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
bf20: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
bf30: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
bf40: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
bf50: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
bf60: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
bf70: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
bf80: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
bf90: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
bfa0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
bfb0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
bfc0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
bfd0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
bfe0: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
bff0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
c000: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
c010: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
c020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
c030: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
c040: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
c050: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
c060: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
c070: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c080: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
c090: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
c0a0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
c0b0: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
c0c0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
c0d0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
c0e0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
c0f0: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
c100: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
c110: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c120: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
c130: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
c140: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
c150: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
c160: 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
c170: 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
c180: 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
c190: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
c1a0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
c1b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
c1c0: 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
c1d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
c1e0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
c1f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
c200: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
c210: 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
c220: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
c230: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
c240: 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
c250: 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
c260: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
c270: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c280: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
c290: 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  red;.      pBt->
c2a0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
c2b0: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
c2c0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
c2d0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
c2e0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
c2f0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
c300: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
c310: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
c320: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
c330: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
c340: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
c350: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
c360: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
c370: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
c380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
c390: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c3a0: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
c3b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
c3c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
c3d0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
c3e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c3f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
c400: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
c410: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
c420: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
c430: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
c440: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
c450: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
c460: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
c470: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
c480: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
c490: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
c4a0: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
c4b0: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
c4c0: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
c4d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c4e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
c4f0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
c500: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
c510: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
c520: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
c530: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
c540: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
c550: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
c560: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
c570: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
c580: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
c590: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
c5a0: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
c5b0: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
c5c0: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
c5d0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
c5e0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
c5f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
c600: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
c610: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
c620: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
c630: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
c640: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
c650: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
c660: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
c670: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
c680: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
c690: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
c6a0: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
c6b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
c6c0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
c6d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
c6e0: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
c6f0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
c700: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
c710: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
c720: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
c730: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
c740: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
c750: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
c760: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
c770: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c780: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
c790: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
c7a0: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
c7b0: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
c7c0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
c7d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
c7e0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
c7f0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
c800: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
c810: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
c820: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
c830: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c840: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
c850: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
c860: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
c870: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c880: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
c890: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
c8a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
c8b0: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
c8c0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
c8d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c8e0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
c8f0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
c900: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  pBtree = 0;.  }.
c910: 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
c920: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
c930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c940: 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
c950: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
c960: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
c970: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
c980: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
c990: 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
c9a0: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
c9b0: 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
c9c0: 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
c9d0: 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
c9e0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
c9f0: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
ca00: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
ca10: 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
ca20: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
ca30: 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
ca40: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
ca50: 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
ca60: 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
ca70: 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
ca80: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
ca90: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
caa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cab0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
cac0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
cad0: 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72  Master;.  BtShar
cae0: 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
caf0: 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
cb00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cb10: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
cb20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cb30: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
cb40: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
cb50: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
cb60: 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74  MASTER);.  sqlit
cb70: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
cb80: 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
cb90: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
cba0: 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
cbb0: 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
cbc0: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
cbd0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
cbe0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
cbf0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
cc00: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
cc10: 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
cc20: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
cc30: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
cc40: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
cc50: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
cc60: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
cc70: 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
cc80: 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
cc90: 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
cca0: 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
ccb0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
ccc0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
ccd0: 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
cce0: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
ccf0: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
cd00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
cd10: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
cd20: 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
cd30: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
cd40: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
cd50: 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
cd60: 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
cd70: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
cd80: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
cd90: 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
cda0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
cdb0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
cdc0: 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
cdd0: 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
cde0: 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
cdf0: 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
ce00: 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
ce10: 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
ce20: 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
ce30: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
ce40: 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
ce50: 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
ce60: 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
ce70: 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
ce80: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
ce90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
cea0: 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
ceb0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
cec0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
ced0: 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
cee0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
cef0: 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
cf00: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
cf10: 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
cf20: 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
cf30: 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
cf40: 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
cf50: 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
cf60: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
cf70: 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
cf80: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
cf90: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
cfa0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
cfb0: 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
cfc0: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
cfd0: 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
cfe0: 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
cff0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d000: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
d010: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
d020: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
d030: 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
d040: 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43    pCur = pBt->pC
d050: 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
d060: 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75  pCur ){.    BtCu
d070: 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75  rsor *pTmp = pCu
d080: 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43  r;.    pCur = pC
d090: 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ur->pNext;.    i
d0a0: 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d  f( pTmp->pBtree=
d0b0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =p ){.      sqli
d0c0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
d0d0: 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d  sor(pTmp);.    }
d0e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
d0f0: 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74  ack any active t
d100: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66  ransaction and f
d110: 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73  ree the handle s
d120: 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54  tructure..  ** T
d130: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
d140: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
d150: 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c  ) drops any tabl
d160: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a  e-locks held by.
d170: 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65    ** this handle
d180: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
d190: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29  BtreeRollback(p)
d1a0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
d1b0: 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
d1c0: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
d1d0: 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
d1e0: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
d1f0: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
d200: 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
d210: 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
d220: 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
d230: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
d240: 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
d250: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
d260: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d270: 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
d280: 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
d290: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
d2a0: 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
d2b0: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
d2c0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
d2d0: 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
d2e0: 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
d2f0: 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
d300: 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
d310: 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
d320: 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
d330: 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
d340: 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
d350: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
d360: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
d370: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
d380: 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
d390: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
d3a0: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
d3b0: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
d3c0: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
d3d0: 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
d3e0: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
d3f0: 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
d400: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
d410: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d420: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
d430: 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
d440: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
d450: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
d460: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d470: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
d480: 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
d490: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
d4a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
d4b0: 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
d4c0: 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
d4d0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
d4e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
d4f0: 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
d500: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
d510: 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
d520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
d530: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d540: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
d550: 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
d560: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
d570: 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
d580: 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
d590: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
d5a0: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
d5b0: 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
d5c0: 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
d5d0: 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
d5e0: 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
d5f0: 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
d600: 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
d610: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
d620: 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
d630: 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
d640: 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
d650: 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
d660: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
d670: 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
d680: 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
d690: 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
d6a0: 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
d6b0: 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
d6c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
d6d0: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
d6e0: 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
d6f0: 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
d700: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
d710: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
d720: 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
d730: 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
d740: 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
d750: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
d760: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
d770: 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
d780: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
d790: 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
d7a0: 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
d7b0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
d7c0: 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
d7d0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
d7e0: 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
d7f0: 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
d800: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
d810: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
d820: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
d830: 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
d840: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
d850: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d860: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
d870: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
d880: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
d890: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
d8a0: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
d8b0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
d8c0: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
d8d0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
d8e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d8f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
d900: 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
d910: 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
d920: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
d930: 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
d940: 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
d950: 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
d960: 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
d970: 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
d980: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
d990: 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
d9a0: 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
d9b0: 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
d9c0: 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
d9d0: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
d9e0: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
d9f0: 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
da00: 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
da10: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
da20: 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
da30: 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
da40: 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
da50: 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
da60: 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
da70: 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
da80: 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
da90: 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
daa0: 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
dab0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
dac0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
dad0: 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
dae0: 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  3BtreeSetSafetyL
daf0: 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69  evel(Btree *p, i
db00: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
db10: 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61  llSync){.  BtSha
db20: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
db30: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
db40: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
db50: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
db60: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
db70: 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
db80: 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
db90: 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65  Level(pBt->pPage
dba0: 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79  r, level, fullSy
dbb0: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nc);.  sqlite3Bt
dbc0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
dbd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dbe0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
dbf0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
dc00: 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20  the given btree 
dc10: 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79  is set to safety
dc20: 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74   level 1.  In ot
dc30: 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65  her.** words, re
dc40: 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20  turn TRUE if no 
dc50: 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e  sync() occurs on
dc60: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e   the disk files.
dc70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
dc80: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
dc90: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
dca0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
dcb0: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  >pBt;.  int rc;.
dcc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dcd0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
dce0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a  db->mutex) );  .
dcf0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
dd00: 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
dd10: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
dd20: 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73  ager );.  rc = s
dd30: 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
dd40: 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
dd50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
dd60: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
dd70: 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66   rc;.}..#if !def
dd80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
dd90: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
dda0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
ddb0: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
ddc0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
ddd0: 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
dde0: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
ddf0: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
de00: 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
de10: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
de20: 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
de30: 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
de40: 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
de50: 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
de60: 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
de70: 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
de80: 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
de90: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
dea0: 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
deb0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
dec0: 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
ded0: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
dee0: 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
def0: 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
df00: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
df10: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
df20: 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
df30: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
df40: 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
df50: 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
df60: 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
df70: 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
df80: 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
df90: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
dfa0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
dfb0: 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
dfc0: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
dfd0: 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
dfe0: 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
dff0: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
e000: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
e010: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e020: 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
e030: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
e040: 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
e050: 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
e060: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
e070: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
e080: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
e090: 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
e0a0: 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
e0b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
e0c0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
e0d0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
e0e0: 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
e0f0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
e100: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e110: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
e120: 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
e130: 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
e140: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
e150: 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
e160: 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
e170: 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
e180: 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
e190: 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
e1a0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
e1b0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
e1c0: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
e1d0: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
e1e0: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
e1f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
e200: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
e210: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
e220: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
e230: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
e240: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
e250: 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
e260: 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
e270: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72  pace(pBt);.    r
e280: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e290: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
e2a0: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
e2b0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
e2c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
e2d0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
e2e0: 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
e2f0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
e300: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
e310: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
e320: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
e330: 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
e340: 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
e350: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
e360: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
e370: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
e380: 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
e390: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
e3a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
e3b0: 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
e3c0: 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
e3d0: 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
e3e0: 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
e3f0: 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
e400: 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
e410: 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
e420: 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
e430: 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
e440: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e450: 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
e460: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
e470: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e480: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
e490: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
e4a0: 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
e4b0: 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
e4c0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
e4d0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
e4e0: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
e4f0: 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
e500: 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
e510: 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
e520: 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
e530: 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
e540: 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
e550: 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
e560: 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
e570: 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
e580: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
e590: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
e5a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
e5b0: 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
e5c0: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
e5d0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
e5e0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
e5f0: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
e600: 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
e610: 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
e620: 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
e630: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
e640: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
e650: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
e660: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
e670: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
e680: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e690: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
e6a0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
e6b0: 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
e6c0: 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
e6d0: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
e6e0: 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
e6f0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
e700: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
e710: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
e720: 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
e730: 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
e740: 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
e750: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
e760: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
e770: 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
e780: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
e790: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
e7a0: 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
e7b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
e7c0: 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
e7d0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
e7e0: 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
e7f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e800: 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
e810: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
e820: 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
e830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
e840: 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
e850: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
e860: 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
e870: 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
e880: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
e890: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
e8a0: 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a  Fixed && (av ?1:
e8b0: 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
e8c0: 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
e8d0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
e8e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
e8f0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
e900: 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
e910: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
e920: 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
e930: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
e940: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
e950: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
e960: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
e970: 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
e980: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
e990: 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
e9a0: 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
e9b0: 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
e9c0: 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
e9d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
e9e0: 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
e9f0: 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
ea00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ea10: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
ea20: 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
ea30: 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
ea40: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
ea50: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
ea60: 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
ea70: 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
ea80: 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
ea90: 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
eaa0: 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
eab0: 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
eac0: 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
ead0: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
eae0: 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
eaf0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
eb00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
eb10: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
eb20: 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
eb30: 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
eb40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
eb50: 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
eb60: 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
eb70: 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
eb80: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
eb90: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
eba0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
ebb0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
ebc0: 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
ebd0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
ebe0: 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
ebf0: 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
ec00: 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
ec10: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
ec20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
ec30: 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
ec40: 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
ec50: 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
ec60: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
ec70: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
ec80: 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
ec90: 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
eca0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
ecb0: 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  1;.  int nPage;.
ecc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ecd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ece0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
ecf0: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  f( pBt->pPage1 )
ed00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ed10: 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  K;.  rc = sqlite
ed20: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
ed30: 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
ed40: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ed50: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
ed60: 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
ed70: 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
ed80: 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
ed90: 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
eda0: 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
edb0: 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
edc0: 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e. .  */.  rc = 
edd0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
ede0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
edf0: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
ee00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ee10: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
ee20: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
ee30: 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65   }else if( nPage
ee40: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61  >0 ){.    int pa
ee50: 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  geSize;.    int 
ee60: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
ee70: 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
ee80: 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
ee90: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
eea0: 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
eeb0: 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
eec0: 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
eed0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
eee0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
eef0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
ef00: 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
ef10: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
ef20: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
ef30: 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
ef40: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
ef50: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
ef60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
ef70: 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
ef80: 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
ef90: 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
efa0: 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
efb0: 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
efc0: 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
efd0: 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
efe0: 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
eff0: 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
f000: 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
f010: 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
f020: 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
f030: 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
f040: 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
f050: 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
f060: 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
f070: 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
f080: 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
f090: 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
f0a0: 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
f0b0: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
f0c0: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
f0d0: 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
f0e0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67   = get2byte(&pag
f0f0: 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  e1[16]);.    if(
f100: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
f110: 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70  ageSize)!=0 || p
f120: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20  ageSize<512 ||. 
f130: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d         (SQLITE_M
f140: 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37  AX_PAGE_SIZE<327
f150: 36 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53  68 && pageSize>S
f160: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
f170: 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  IZE).    ){.    
f180: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
f190: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
f1a0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
f1b0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
f1c0: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
f1d0: 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
f1e0: 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
f1f0: 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
f200: 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
f210: 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
f220: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
f230: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
f240: 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
f250: 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
f260: 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
f270: 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
f280: 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
f290: 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
f2a0: 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
f2b0: 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
f2c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
f2d0: 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
f2e0: 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
f2f0: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
f300: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
f310: 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
f320: 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
f330: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
f340: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
f350: 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
f360: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
f370: 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
f380: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
f390: 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a  = (u16)usableSiz
f3a0: 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
f3b0: 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
f3c0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
f3d0: 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
f3e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
f3f0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
f400: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
f410: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
f420: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f430: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
f440: 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 35  if( usableSize<5
f450: 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  00 ){.      goto
f460: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
f470: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
f480: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
f490: 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  16)pageSize;.   
f4a0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
f4b0: 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69   = (u16)usableSi
f4c0: 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
f4d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f4e0: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
f4f0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
f500: 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
f510: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
f520: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
f530: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
f540: 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
f550: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
f560: 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
f570: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
f580: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
f590: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
f5a0: 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
f5b0: 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
f5c0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
f5d0: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
f5e0: 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
f5f0: 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
f600: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
f610: 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
f620: 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
f630: 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
f640: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
f650: 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
f660: 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
f670: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
f680: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
f690: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
f6a0: 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
f6b0: 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
f6c0: 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
f6d0: 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
f6e0: 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
f6f0: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
f700: 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
f710: 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
f720: 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
f730: 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
f740: 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
f750: 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
f760: 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
f770: 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
f780: 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
f790: 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
f7a0: 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
f7b0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
f7c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
f7d0: 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*64/255 - 23;.
f7e0: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
f7f0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
f800: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
f810: 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
f820: 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
f830: 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
f840: 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
f850: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
f860: 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
f870: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
f880: 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
f890: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
f8a0: 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
f8b0: 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75  = pPage1;.  retu
f8c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
f8d0: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
f8e0: 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
f8f0: 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
f900: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
f910: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f920: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
f930: 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74  orks like lockBt
f940: 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61  ree() except tha
f950: 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65  t it also invoke
f960: 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61  s the.** busy ca
f970: 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20  llback if there 
f980: 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  is lock contenti
f990: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
f9a0: 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  t lockBtreeWithR
f9b0: 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66  etry(Btree *pRef
f9c0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f9d0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
f9e0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
f9f0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29  HoldsMutex(pRef)
fa00: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e   );.  if( pRef->
fa10: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
fa20: 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e  ONE ){.    u8 in
fa30: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52  Transaction = pR
fa40: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
fa50: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65  action;.    btre
fa60: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
fa70: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
fa80: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
fa90: 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20  s(pRef, 0);.    
faa0: 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
fab0: 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61  nsaction = inTra
fac0: 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52  nsaction;.    pR
fad0: 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52  ef->inTrans = TR
fae0: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66  ANS_NONE;.    if
faf0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fb00: 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70  ){.      pRef->p
fb10: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
fb20: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74  --;.    }.    bt
fb30: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
fb40: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
fb50: 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a   rc;.}.       ..
fb60: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
fb70: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
fb80: 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
fb90: 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
fba0: 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
fbb0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
fbc0: 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
fbd0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
fbe0: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
fbf0: 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
fc00: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
fc10: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fc20: 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
fc30: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
fc40: 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
fc50: 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
fc60: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
fc70: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
fc80: 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  sors, this routi
fc90: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
fca0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
fcb0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
fcc0: 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
fcd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
fce0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
fcf0: 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
fd00: 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
fd10: 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
fd20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fd30: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
fd40: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
fd50: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
fd60: 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
fd70: 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70  >pCursor==0 && p
fd80: 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
fd90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
fda0: 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
fdb0: 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b  t->pPager)>=1 ){
fdc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fdd0: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
fde0: 61 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20  a );.#if 0.     
fdf0: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
fe00: 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ->aData==0 ){.  
fe10: 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
fe20: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67  Page = pBt->pPag
fe30: 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e1;.        pPag
fe40: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
fe50: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
fe60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
fe70: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
fe80: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
fe90: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
fea0: 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  1;.      }.#endi
feb0: 66 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  f.      releaseP
fec0: 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29  age(pBt->pPage1)
fed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
fee0: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d  >pPage1 = 0;.  }
fef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
ff00: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
ff10: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
ff20: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
ff30: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  f the.** file..*
ff40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
ff50: 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
ff60: 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
ff70: 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
ff80: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
ff90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
ffa0: 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  nPage;..  assert
ffb0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
ffc0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
ffd0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
ffe0: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
fff0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
10000 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
10010 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50  =SQLITE_OK || nP
10020 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
10030 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
10040 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
10050 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
10060 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
10070 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
10080 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
10090 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
100a0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
100b0 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
100c0 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
100d0 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
100e0 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
100f0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
10100 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
10110 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
10120 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67  ta[16], pBt->pag
10130 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31  eSize);.  data[1
10140 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
10150 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
10160 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
10170 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
10180 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
10190 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
101a0 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
101b0 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
101c0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
101d0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
101e0 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
101f0 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
10200 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
10210 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
10220 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
10230 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
10240 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
10250 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
10260 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53   );.  pBt->pageS
10270 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
10280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10290 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
102a0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
102b0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
102c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
102d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
102e0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
102f0 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
10300 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
10310 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
10320 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
10330 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
10340 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
10350 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
10360 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  um);.#endif.  re
10370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10380 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
10390 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
103a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
103b0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
103c0 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
103d0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
103e0 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
103f0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
10400 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
10410 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
10420 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
10430 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
10440 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
10450 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
10460 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
10470 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
10480 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
10490 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
104a0 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
104b0 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
104c0 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
104d0 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
104e0 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
104f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
10500 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
10510 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
10520 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
10530 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
10540 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
10550 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10560 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
10570 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
10580 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
10590 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
105a0 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
105b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
105c0 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
105d0 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
105e0 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
105f0 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
10600 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10610 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
10620 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10630 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
10640 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
10650 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
10660 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
10670 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
10680 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
10690 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
106a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
106b0 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
106c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
106d0 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
106e0 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
106f0 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
10700 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
10710 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
10720 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
10730 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
10740 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
10750 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
10760 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
10770 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
10780 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
10790 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
107a0 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
107b0 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
107c0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
107d0 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
107e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
107f0 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
10800 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
10810 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
10820 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
10830 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
10840 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
10850 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
10860 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
10870 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
10880 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
10890 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
108a0 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
108b0 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
108c0 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
108d0 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
108e0 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
108f0 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
10900 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
10910 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
10920 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
10930 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
10940 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
10950 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
10960 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
10970 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
10980 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
10990 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
109a0 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
109b0 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
109c0 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
109d0 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
109e0 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
109f0 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
10a00 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
10a10 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
10a20 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
10a30 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
10a40 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73  int wrflag){.  s
10a50 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
10a60 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
10a70 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10a80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10a90 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
10aa0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
10ab0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
10ac0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
10ad0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
10ae0 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
10af0 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
10b00 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
10b10 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
10b20 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
10b30 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
10b40 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
10b50 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
10b60 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
10b70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
10b80 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
10b90 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
10ba0 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
10bb0 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
10bc0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
10bd0 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  gun;.  }..  /* W
10be0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
10bf0 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
10c00 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
10c10 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
10c20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
10c30 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  y && wrflag ){. 
10c40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
10c50 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
10c60 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
10c70 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
10c80 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10c90 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
10ca0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
10cb0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
10cc0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
10cd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
10ce0 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
10cf0 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
10d00 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
10d10 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
10d20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
10d30 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
10d40 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
10d50 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
10d60 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10d70 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20  n==TRANS_WRITE) 
10d80 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e  || pBt->isPendin
10d90 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20  g ){.    pBlock 
10da0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
10db0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
10dc0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
10dd0 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
10de0 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
10df0 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
10e00 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
10e10 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
10e20 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
10e30 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
10e40 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
10e50 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
10e60 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
10e70 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
10e80 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
10e90 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
10ea0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
10eb0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
10ec0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
10ed0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
10ee0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
10ef0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20   }.#endif..  do 
10f00 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  {.    if( pBt->p
10f10 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
10f20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63    do{.        rc
10f30 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
10f40 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
10f50 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
10f60 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
10f70 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
10f80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10f90 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
10fa0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61      if( pBt->rea
10fb0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
10fc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
10fd0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
10fe0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
10ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
11000 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  in(pBt->pPager, 
11010 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20  wrflag>1);.     
11020 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11030 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11040 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
11050 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
11060 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11070 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
11080 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11090 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
110a0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
110b0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d   }.  }while( rc=
110c0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
110d0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
110e0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
110f0 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
11100 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
11110 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
11120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11130 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
11140 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
11150 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
11160 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
11170 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
11180 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
11190 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
111a0 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
111b0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
111c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
111d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
111e0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
111f0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69  nTrans;.    }.#i
11200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11210 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
11220 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
11230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
11240 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
11250 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
11260 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
11270 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
11280 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b   (u8)(wrflag>1);
11290 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
112a0 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
112b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
112c0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
112d0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
112e0 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
112f0 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
11300 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
11310 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
11320 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
11330 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
11340 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
11350 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
11360 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
11370 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
11380 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
11390 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
113a0 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
113b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
113c0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
113d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
113e0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
113f0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
11400 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
11410 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11420 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11430 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11440 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
11450 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
11460 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
11470 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
11480 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
11490 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
114a0 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
114b0 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
114c0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
114d0 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
114e0 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
114f0 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
11500 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
11510 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
11520 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
11530 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
11540 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11560 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
11570 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
11580 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
115b0 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
115c0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
115f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
11600 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11610 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
11620 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
11630 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
11640 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
11650 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
11660 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11670 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
11680 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
11690 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
116a0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
116b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
116c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
116d0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
116e0 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
116f0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
11700 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
11710 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
11720 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
11730 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
11740 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ;..    rc = ptrm
11750 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
11760 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
11770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11780 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
11790 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
117a0 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  s_out;.    }..  
117b0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
117c0 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
117d0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
117e0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
117f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
11800 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
11810 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
11820 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
11830 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11840 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64  ) goto set_child
11850 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
11860 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
11870 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
11880 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
11890 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
118a0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
118b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
118c0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
118d0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
118e0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
118f0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65  , pgno);.  }..se
11900 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
11910 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
11920 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
11930 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
11940 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
11950 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69  re on pPage, whi
11960 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  ch is guarenteed
11970 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70   to be a btree p
11980 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72  age, not an over
11990 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73  flow.** page, is
119a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
119b0 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79  ge iFrom. Modify
119c0 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
119d0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
119e0 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d  to.** iTo. Param
119f0 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
11a00 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
11a10 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d   pointer to be m
11a20 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20  odified, as .** 
11a30 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
11a40 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
11a50 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
11a60 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
11a70 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
11a80 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
11a90 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
11aa0 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
11ab0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
11ac0 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
11ad0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
11ae0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
11af0 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
11b20 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
11b30 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
11b40 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
11b50 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
11b60 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
11b70 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
11b80 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
11b90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11ba0 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
11bb0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
11bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
11bd0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
11be0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
11bf0 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
11c00 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
11c10 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
11c20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11c30 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
11c40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
11c50 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
11c60 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
11c70 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
11c80 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
11c90 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
11ca0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
11cb0 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
11cc0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
11cd0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
11ce0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
11cf0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
11d00 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
11d10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11d20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
11d30 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
11d40 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
11d50 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
11d60 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74  e{.    u8 isInit
11d70 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
11d80 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
11d90 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
11da0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
11db0 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
11dc0 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
11dd0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
11de0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
11df0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
11e00 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
11e10 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
11e20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
11e30 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
11e40 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
11e50 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
11e60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
11e70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
11e80 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
11e90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
11ea0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
11eb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
11ec0 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
11ed0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
11ee0 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  low]) ){.       
11ef0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
11f00 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
11f10 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
11f20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11f30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11f40 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
11f50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
11f60 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
11f70 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
11f80 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
11f90 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
11fa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11fb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11fc0 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
11fd0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
11fe0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
11ff0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
12000 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
12010 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
12020 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
12030 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
12040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12050 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
12060 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
12070 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
12080 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
12090 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
120a0 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
120b0 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
120c0 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
120d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
120e0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
120f0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
12100 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
12110 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
12120 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
12130 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
12140 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
12150 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74  ins valid..*/.st
12160 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
12170 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
12180 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
12190 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
121a0 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
121b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
121c0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
121d0 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
121e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
121f0 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
12200 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
12210 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
12220 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
12230 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
12240 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
12250 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
12260 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
12270 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
12280 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
12290 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
122a0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a  .  int isCommit.
122b0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
122c0 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
122d0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
122e0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
122f0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
12300 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
12310 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
12320 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
12330 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
12340 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
12350 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
12360 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
12370 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
12380 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
12390 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
123a0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
123b0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
123c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
123d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
123e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
123f0 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
12400 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
12410 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
12420 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
12430 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
12440 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
12450 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
12460 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
12470 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
12480 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
12490 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
124a0 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
124b0 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
124c0 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
124d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
124e0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
124f0 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
12500 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
12510 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
12520 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
12540 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
12550 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
12560 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
12570 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
12580 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
12590 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
125a0 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
125b0 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
125c0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
125d0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
125e0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
125f0 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
12600 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
12610 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
12620 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
12630 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
12640 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
12650 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
12660 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
12670 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
12680 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
12690 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
126a0 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
126b0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
126c0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
126d0 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
126e0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
126f0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
12700 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
12710 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
12720 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
12730 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
12740 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
12750 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
12760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12770 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12780 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
12790 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
127a0 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
127b0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
127c0 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
127d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
127e0 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
127f0 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
12800 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
12810 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
12820 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
12840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12850 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
12860 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
12870 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
12880 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
12890 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
128a0 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
128b0 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
128c0 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
128d0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
128e0 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
128f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
12900 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
12910 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
12920 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12930 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
12940 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
12950 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12980 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
12990 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
129a0 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
129b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
129c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
129d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
129e0 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
129f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
12a00 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
12a10 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
12a20 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
12a30 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
12a40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12a50 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
12a60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12a70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
12a80 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
12a90 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
12aa0 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d  iPtrPage);.    }
12ab0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12ac0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
12ad0 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
12ae0 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
12af0 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
12b00 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
12b10 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
12b20 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
12b30 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
12b40 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
12b50 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
12b60 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
12b70 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
12b80 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
12b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
12ba0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
12bb0 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
12bc0 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
12bd0 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
12be0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
12bf0 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
12c00 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
12c10 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
12c20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
12c30 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
12c40 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
12c50 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
12c60 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
12c70 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
12c80 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
12c90 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
12ca0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
12cb0 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
12cc0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
12cd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
12ce0 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
12cf0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
12d00 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
12d10 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
12d20 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
12d30 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
12d40 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
12d50 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
12d60 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
12d70 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
12d80 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
12d90 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
12da0 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
12db0 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ete..*/.static i
12dc0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
12dd0 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
12de0 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
12df0 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
12e00 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
12e10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12e20 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
12e30 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
12e40 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
12e50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12e60 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
12e70 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
12e80 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
12e90 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
12ea0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
12eb0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69  GE(pBt) ){.    i
12ec0 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54  nt rc;.    u8 eT
12ed0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
12ee0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
12ef0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
12f00 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
12f10 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
12f20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
12f30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74 50   || nFin==iLastP
12f40 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  g ){.      retur
12f50 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
12f60 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
12f70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
12f80 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
12f90 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
12fa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12fb0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
12fc0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
12fd0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
12fe0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
12ff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13000 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
13010 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
13020 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
13030 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
13040 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
13050 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
13060 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
13070 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
13080 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
13090 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
130a0 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
130b0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
130c0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
130d0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
130e0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
130f0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
13100 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
13110 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
13120 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
13130 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
13140 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
13150 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
13160 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13170 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
13180 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
13190 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
131a0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
131b0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
131c0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
131d0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
131e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
131f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13200 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13210 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13220 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
13230 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
13240 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
13250 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
13260 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
13270 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
13280 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
13290 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
132a0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
132b0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
132c0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
132d0 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
132e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
132f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
13300 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
13310 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
13320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13330 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13340 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13350 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
13360 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
13370 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
13380 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
13390 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
133a0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
133b0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
133c0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
133d0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
133e0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
133f0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
13400 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
13410 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
13420 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
13430 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
13440 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
13450 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
13460 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
13470 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
13480 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
13490 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
134a0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
134b0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
134c0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
134d0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
134e0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
134f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
13500 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13510 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13520 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
13530 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
13540 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
13560 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
13570 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
13580 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
13590 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
135a0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
135b0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
135c0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
135d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
135e0 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
135f0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
13600 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13610 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
13620 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
13630 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
13640 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
13650 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
13660 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
13670 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
13680 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
136a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
136b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
136c0 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
136d0 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
136e0 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
136f0 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
13700 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
13710 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
13720 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
13730 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
13740 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
13750 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
13760 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
13770 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
13780 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
13790 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50  Bt, iLastPg, &pP
137a0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
137b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
137c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
137d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
137e0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
137f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
13800 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
13810 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
13820 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
13830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13870 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
13880 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13890 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
138a0 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
138b0 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20   iLastPg);.  }. 
138c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
138d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
138e0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
138f0 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
13900 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
13910 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
13920 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
13930 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
13940 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
13950 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
13960 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
13970 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
13980 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
13990 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
139a0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
139b0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
139c0 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
139d0 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
139e0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
139f0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
13a00 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
13a10 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
13a20 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
13a30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13a40 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
13a50 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
13a60 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
13a70 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
13a80 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13a90 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
13aa0 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
13ab0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
13ac0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
13ad0 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
13ae0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
13af0 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
13b00 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
13b10 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
13b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76    }else{.    inv
13b30 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
13b40 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
13b50 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
13b60 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70 61  mStep(pBt, 0, pa
13b70 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
13b80 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
13b90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13ba0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13bb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13bc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
13bd0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
13be0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
13bf0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
13c00 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
13c10 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
13c20 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
13c30 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
13c40 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
13c50 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
13c60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
13c70 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
13c80 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
13c90 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
13ca0 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
13cb0 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
13cc0 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
13cd0 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
13ce0 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
13cf0 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
13d00 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
13d10 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
13d20 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
13d30 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
13d40 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
13d50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13d60 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
13d70 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
13d80 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
13d90 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
13da0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
13db0 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
13dc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13dd0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
13de0 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
13df0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
13e00 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
13e10 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
13e20 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
13e30 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
13e40 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67  gno nFin;.    Pg
13e50 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 50 67  no nFree;.    Pg
13e60 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20  no nPtrmap;.    
13e70 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20 20 20  Pgno iFree;.    
13e80 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
13e90 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a   pBt->pageSize;.
13ea0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
13eb0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
13ec0 70 42 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 50  pBt);..    if( P
13ed0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
13ee0 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20  , nOrig) ){.    
13ef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13f00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
13f10 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 72 69    }.    if( nOri
13f20 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
13f30 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
13f40 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20     nOrig--;.    
13f50 7d 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  }.    nFree = ge
13f60 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
13f70 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
13f80 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  .    nPtrmap = (
13f90 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
13fa0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
13fb0 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70  Orig)+pgsz/5)/(p
13fc0 67 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e  gsz/5);.    nFin
13fd0 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
13fe0 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20   - nPtrmap;.    
13ff0 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
14000 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
14010 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e   && nFin<=PENDIN
14020 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
14030 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
14040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
14050 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
14060 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
14070 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
14080 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
14090 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
140a0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65   }..    for(iFre
140b0 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
140c0 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
140d0 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
140e0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
140f0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
14100 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20  Fin, iFree);.   
14110 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
14120 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
14130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
14140 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
14150 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14160 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14170 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
14180 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
14190 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
141a0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
141b0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
141c0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
141d0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
141e0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
141f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14200 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
14210 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29  t->pPager, nFin)
14220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
14250 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
14260 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
14270 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
14280 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
14290 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
142a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
142b0 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
142c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
142d0 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  OVACUUM */../*.*
142e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
142f0 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
14300 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
14310 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
14320 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
14330 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
14340 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
14350 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
14360 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
14370 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
14380 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
14390 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
143a0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
143b0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
143c0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
143d0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
143e0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
143f0 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
14400 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
14410 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
14420 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
14430 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
14440 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
14450 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
14460 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
14470 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
14480 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
14490 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
144a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
144b0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
144c0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
144d0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
144e0 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
144f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
14500 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
14510 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
14520 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
14530 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
14540 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
14550 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
14560 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
14570 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
14580 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65  mit() for the se
14590 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
145a0 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
145b0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
145c0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
145d0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
145e0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
145f0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
14600 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
14610 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
14620 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
14630 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
14640 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
14650 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
14660 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
14670 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
14680 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
14690 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
146a0 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
146b0 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
146c0 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
146d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
146e0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
146f0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
14700 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
14710 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
14720 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
14730 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
14740 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
14750 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
14760 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
14770 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
14780 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
14790 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
147a0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
147b0 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
147c0 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
147d0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
147e0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
147f0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
14800 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
14810 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
14820 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
14830 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
14840 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
14850 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
14860 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
14870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14880 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
14890 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
148a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
148b0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
148c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
148d0 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
148e0 70 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  p->db;.#ifndef S
148f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14900 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
14910 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
14920 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
14930 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
14940 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14960 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14970 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
14980 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14990 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
149a0 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
149b0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
149c0 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
149d0 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  ger, zMaster, 0)
149e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
149f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
14a00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14a10 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
14a20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
14a30 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
14a40 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
14a50 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
14a60 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
14a70 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
14a80 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
14a90 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
14aa0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
14ab0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
14ac0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  and should be in
14ad0 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  voked.** prior t
14ae0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
14af0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
14b00 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20  ite3BtreeSync() 
14b10 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61  routine did.** a
14b20 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
14b30 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
14b40 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
14b50 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
14b60 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
14b70 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
14b80 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
14b90 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
14ba0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
14bb0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
14bc0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
14bd0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
14be0 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20  urnal.** (which 
14bf0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
14c00 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
14c10 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73  ) and drop locks
14c20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
14c30 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
14c40 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
14c50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
14c60 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
14c70 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
14c80 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
14c90 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
14ca0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
14cb0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
14cc0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a  eTwo(Btree *p){.
14cd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14ce0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
14cf0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14d00 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
14d10 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74  ->db;.  btreeInt
14d20 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
14d30 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
14d40 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
14d50 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
14d60 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
14d70 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
14d80 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
14d90 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
14da0 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
14db0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
14dc0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
14dd0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
14de0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
14df0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14e00 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
14e10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
14e20 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
14e30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
14e40 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
14e50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
14e60 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
14e70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14e80 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14e90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
14ea0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14eb0 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
14ec0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
14ed0 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 63 6c 65  _READ;.  }.  cle
14ee0 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
14ef0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 0a  TableLocks(p);..
14f00 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
14f10 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20  le has any kind 
14f20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
14f30 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
14f40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
14f50 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65   ** count of the
14f60 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
14f70 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
14f80 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  n count reaches 
14f90 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20  0, set.  ** the 
14fa0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
14fb0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
14fc0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
14fd0 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77  sed() call below
14fe0 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63  .  ** will unloc
14ff0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  k the pager..  *
15000 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
15010 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
15020 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  {.    pBt->nTran
15030 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
15040 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
15050 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
15060 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15070 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
15080 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15090 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65  * Set the handle
150a0 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  s current transa
150b0 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
150c0 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
150d0 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61  lock.  ** the pa
150e0 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
150f0 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
15100 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
15110 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
15120 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  .  btreeClearHas
15130 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
15140 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
15150 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63  NS_NONE;.  unloc
15160 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
15170 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  Bt);..  btreeInt
15180 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
15190 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
151a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
151b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
151c0 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
151d0 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
151e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
151f0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
15200 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
15210 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15220 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
15230 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
15240 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
15250 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15260 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15270 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
15280 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20  aseTwo(p);.  }. 
15290 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
152a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
152b0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
152c0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
152d0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
152e0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f   write-cursors o
152f0 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64  pen on this hand
15300 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  le. This is for 
15310 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
15320 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
15330 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
15340 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
15350 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
15360 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
15370 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
15380 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72  is routine, a wr
15390 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e  ite-cursor is an
153a0 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
153b0 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77   is capable of w
153c0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
153d0 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61  tabse.  That mea
153e0 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  ns the cursor wa
153f0 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20  s.** originally 
15400 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
15410 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ng and the curso
15420 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73  r has not be dis
15430 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69  abled.** by havi
15440 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61  ng its state cha
15450 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46  nged to CURSOR_F
15460 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  AULT..*/.static 
15470 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75  int countWriteCu
15480 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
15490 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
154a0 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
154b0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
154c0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
154d0 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
154e0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
154f0 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70  Cur->wrFlag && p
15500 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
15510 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
15520 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
15530 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
15540 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
15550 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
15560 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
15570 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
15580 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
15590 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
155a0 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74  on BtShared that
155b0 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
155c0 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  ences..**.** Eve
155d0 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69  ry cursor is tri
155e0 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
155f0 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c  cursors that bel
15600 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20  ong.** to other 
15610 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
15620 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
15630 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a   to be sharing.*
15640 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  * the cache with
15650 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
15660 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
15670 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
15680 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a  ollback occurs..
15690 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75  ** All cursors u
156a0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61  sing the same ca
156b0 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70  che must be trip
156c0 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e  ped.** to preven
156d0 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69  t them from tryi
156e0 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74  ng to use the bt
156f0 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ree after.** the
15700 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
15710 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
15720 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73  e deleted tables
15730 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f  .** or moved roo
15740 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69  t pages, so it i
15750 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
15760 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20   to.** save the 
15770 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
15780 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72  sor.  The cursor
15790 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61   must be.** inva
157a0 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  lidated..*/.void
157b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
157c0 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
157d0 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
157e0 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72  rrCode){.  BtCur
157f0 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  sor *p;.  sqlite
15800 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
15810 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ee);.  for(p=pBt
15820 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
15830 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
15840 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
15850 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
15860 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
15870 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
15880 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
15890 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64  p->skip = errCod
158a0 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
158b0 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  i<=p->iPage; i++
158c0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
158d0 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69  Page(p->apPage[i
158e0 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50  ]);.      p->apP
158f0 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  age[i] = 0;.    
15900 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
15910 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
15920 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
15930 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
15940 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
15950 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  .  All cursors w
15960 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ill be.** invali
15970 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ded by this oper
15980 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
15990 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72  mpt to use a cur
159a0 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20  sor.** that was 
159b0 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
159c0 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
159d0 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  eration will res
159e0 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72  ult.** in an err
159f0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
15a00 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
15a10 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
15a20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15a30 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
15a40 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
15a50 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
15a60 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
15a70 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
15a80 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15a90 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
15aa0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
15ab0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15ac0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
15ad0 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  1;..  sqlite3Btr
15ae0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
15af0 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
15b00 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
15b10 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
15b20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15b30 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15b40 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
15b50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
15b60 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
15b70 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
15b80 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
15b90 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
15ba0 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79  hilst.    ** try
15bb0 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73  ing to save curs
15bc0 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66  or positions. If
15bd0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
15be0 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28  matic rollback (
15bf0 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  as.    ** the re
15c00 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72  sult of a constr
15c10 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66  aint, malloc() f
15c20 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72  ailure or IO err
15c30 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  or) then .    **
15c40 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62   the cache may b
15c50 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63  e internally inc
15c60 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63  onsistent (not c
15c70 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65  ontain valid tre
15c80 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65  es) so.    ** we
15c90 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72   cannot simply r
15ca0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
15cb0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49  to the caller. I
15cc0 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20  nstead, abort . 
15cd0 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65     ** all querie
15ce0 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  s that may be us
15cf0 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63  ing any of the c
15d00 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c  ursors that fail
15d10 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20  ed to save..    
15d20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
15d30 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
15d40 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65  s(p, rc);.  }.#e
15d50 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65  ndif.  btreeInte
15d60 67 72 69 74 79 28 70 29 3b 0a 20 20 63 6c 65 61  grity(p);.  clea
15d70 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
15d80 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 0a 20  ableLocks(p);.. 
15d90 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
15da0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
15db0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
15dc0 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
15dd0 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
15de0 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
15df0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
15e00 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
15e10 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15e20 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
15e30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
15e40 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
15e50 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
15e60 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
15e70 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
15e80 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
15e90 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74     ** call sqlit
15ea0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29  e3BtreeGetPage()
15eb0 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
15ec0 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
15ed0 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
15ee0 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
15ef0 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
15f00 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
15f10 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
15f20 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
15f30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
15f40 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
15f50 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
15f60 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
15f70 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
15f80 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
15f90 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
15fa0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  EAD;.  }..  if( 
15fb0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
15fc0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73  S_NONE ){.    as
15fd0 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
15fe0 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
15ff0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
16000 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d  on--;.    if( 0=
16010 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
16020 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
16030 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
16040 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
16050 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 43   }.  }..  btreeC
16060 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
16070 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  Bt);.  p->inTran
16080 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
16090 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
160a0 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62  nused(pBt);..  b
160b0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
160c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
160d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
160e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
160f0 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
16100 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
16110 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
16120 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20  tion can can be 
16130 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
16140 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
16150 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
16160 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
16170 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
16180 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
16190 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
161a0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
161b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
161c0 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
161d0 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
161e0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
161f0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
16200 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
16210 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
16220 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
16230 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
16240 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
16250 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
16260 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
16270 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
16280 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
16290 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
162a0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
162b0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
162c0 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
162d0 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
162e0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
162f0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
16300 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
16310 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
16320 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
16330 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
16340 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
16350 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
16360 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
16370 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
16380 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
16390 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
163a0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
163b0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
163c0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
163d0 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
163e0 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
163f0 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
16400 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
16410 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
16420 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
16430 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
16440 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
16450 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
16460 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
16470 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
16480 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
16490 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
164a0 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
164b0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
164c0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
164d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
164e0 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
164f0 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
16500 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
16510 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16520 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
16530 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16540 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
16550 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
16560 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
16570 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
16580 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  rt( pBt->readOnl
16590 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
165a0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
165b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
165c0 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
165d0 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66  avepoint );.  if
165e0 28 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61  ( NEVER(p->inTra
165f0 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
16600 7c 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  || pBt->readOnly
16610 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
16620 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20  LITE_INTERNAL;. 
16630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
16640 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
16650 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
16660 49 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74  ITE );.    /* At
16670 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
16680 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
16690 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
166a0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
166b0 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
166c0 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
166d0 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
166e0 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
166f0 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74  ng.    ** SQL st
16700 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
16710 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
16720 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
16730 62 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20  back any.    ** 
16740 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
16750 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
16760 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
16770 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
16780 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
16790 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
167a0 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
167b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61  Bt->pPager, iSta
167c0 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  tement);.  }.  s
167d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
167e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
167f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
16800 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
16810 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
16820 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
16830 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
16840 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
16850 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
16860 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
16870 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
16880 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
16890 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
168a0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
168b0 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
168c0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
168d0 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
168e0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
168f0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
16900 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
16910 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
16920 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
16930 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
16940 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
16950 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
16960 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
16970 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
16980 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
16990 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
169a0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
169b0 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
169c0 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
169d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
169e0 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
169f0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
16a00 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
16a10 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
16a20 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
16a30 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
16a40 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
16a50 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
16a60 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
16a70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
16a80 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
16a90 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
16aa0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
16ab0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
16ac0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
16ad0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
16ae0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
16af0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
16b00 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
16b10 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
16b20 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
16b30 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
16b40 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
16b50 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16b60 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d      pBt->db = p-
16b70 3e 64 62 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  >db;.    rc = sq
16b80 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
16b90 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
16ba0 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
16bb0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
16bc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16bd0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
16be0 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
16bf0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16c00 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
16c10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16c20 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
16c30 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
16c40 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
16c50 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
16c60 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
16c70 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
16c80 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
16c90 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
16ca0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16cb0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
16cc0 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
16cd0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
16ce0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
16cf0 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
16d00 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
16d10 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
16d20 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
16d30 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
16d40 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
16d50 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
16d60 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
16d70 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
16d80 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
16d90 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
16da0 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
16db0 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
16dc0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
16dd0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
16de0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
16df0 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
16e00 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
16e10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16e20 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
16e30 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
16e40 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
16e50 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
16e60 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
16e70 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
16e80 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
16e90 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
16ea0 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
16eb0 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
16ec0 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
16ed0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
16ee0 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
16ef0 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
16f00 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
16f10 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
16f20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
16f30 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16f40 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
16f50 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
16f60 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
16f70 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
16f80 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
16f90 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
16fa0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
16fb0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
16fc0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
16fd0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
16fe0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
16ff0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
17000 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
17010 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
17020 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
17030 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
17040 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
17050 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
17060 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
17070 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
17080 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65  ursorSize() byte
17090 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  s of memory .** 
170a0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43  pointed to by pC
170b0 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72  ur have been zer
170c0 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  oed by the calle
170d0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
170e0 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
170f0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17110 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
17120 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
17130 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
17140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17150 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
17160 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
17170 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
171a0 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
171b0 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
171c0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
171d0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
171e0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
171f0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
17200 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
17210 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17230 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
17240 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
17250 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
17260 6e 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  nPage;.  BtShare
17270 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17280 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17290 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
172a0 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
172b0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
172c0 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  wrFlag==1 );.  i
172d0 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
172e0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
172f0 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 69  eadOnly );.    i
17300 66 28 20 4e 45 56 45 52 28 70 42 74 2d 3e 72 65  f( NEVER(pBt->re
17310 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
17320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
17330 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
17340 20 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72     rc = checkFor
17350 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
17360 20 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a   iTable, 0, 0);.
17370 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
17390 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
173a0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
173b0 41 43 48 45 20 29 3b 0a 20 20 20 20 20 20 72 65  ACHE );.      re
173c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
173d0 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
173e0 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
173f0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
17400 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20  thRetry(p);.    
17410 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17420 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
17430 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
17440 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
17450 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
17460 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17470 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
17480 74 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 20  t->pPager, (int 
17490 2a 29 26 6e 50 61 67 65 29 3b 20 0a 20 20 69 66  *)&nPage); .  if
174a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
174b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
174c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
174d0 6c 65 3d 3d 31 20 26 26 20 6e 50 61 67 65 3d 3d  le==1 && nPage==
174e0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
174f0 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  LITE_EMPTY;.    
17500 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
17510 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
17520 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
17530 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
17540 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
17550 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
17560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17570 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
17580 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
17590 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
175a0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
175b0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
175c0 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
175d0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
175e0 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
175f0 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
17600 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
17610 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
17620 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
17630 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
17640 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
17650 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
17660 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
17670 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
17680 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
17690 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
176a0 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
176b0 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
176c0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
176d0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
176e0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
176f0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
17700 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
17710 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
17720 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
17730 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
17740 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
17750 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
17760 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
17770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61  SQLITE_OK;..crea
17780 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
17790 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  ion:.  releasePa
177a0 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
177b0 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  0]);.  unlockBtr
177c0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
177d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
177e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
177f0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
17800 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
17830 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
17840 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17860 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
17870 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
17880 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
17890 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178b0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
178c0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
178d0 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
178e0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17900 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
17910 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
17920 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
17950 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
17960 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
17970 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
17980 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
17990 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
179a0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
179b0 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
179c0 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
179d0 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
179e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
179f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17a00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17a10 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
17a20 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
17a30 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
17a40 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
17a50 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
17a60 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
17a70 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
17a80 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
17a90 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
17aa0 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
17ab0 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
17ac0 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
17ad0 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
17ae0 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
17af0 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
17b00 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
17b10 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
17b20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17b30 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
17b40 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65  ){.  return size
17b50 6f 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a  of(BtCursor);.}.
17b60 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
17b70 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75  ached rowid valu
17b80 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f  e of every curso
17b90 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  r in the same da
17ba0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
17bb0 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e  s pCur and havin
17bc0 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20  g the same root 
17bd0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70  page number as p
17be0 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20  Cur.  The value 
17bf0 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f  is.** set to iRo
17c00 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  wid..**.** Only 
17c10 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76  positive rowid v
17c20 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
17c30 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74  ered valid for t
17c40 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68  his cache..** Th
17c50 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69  e cache is initi
17c60 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20  alized to zero, 
17c70 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
17c80 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20  valid cache..** 
17c90 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72  A btree will wor
17ca0 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f  k fine with zero
17cb0 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
17cc0 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61  ids.  We just ca
17cd0 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65  nnot.** cache ze
17ce0 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
17cf0 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61  owids, which mea
17d00 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75  ns tables that u
17d10 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65  se zero or.** ne
17d20 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69  gative rowids mi
17d30 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
17d40 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e   slower.  But in
17d50 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a   practice, zero.
17d60 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ** or negative r
17d70 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75  owids are very u
17d80 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20  ncommon so this 
17d90 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
17da0 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
17db0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
17dc0 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
17dd0 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69  rsor *pCur, sqli
17de0 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
17df0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
17e00 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e  ;.  for(p=pCur->
17e10 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
17e20 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
17e30 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
17e40 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t==pCur->pgnoRoo
17e50 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77  t ) p->cachedRow
17e60 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  id = iRowid;.  }
17e70 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
17e80 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52  >cachedRowid==iR
17e90 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  owid );.}../*.**
17ea0 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68   Return the cach
17eb0 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  ed rowid for the
17ec0 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20   given cursor.  
17ed0 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65  A negative or ze
17ee0 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  ro.** return val
17ef0 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ue indicates tha
17f00 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  t the rowid cach
17f10 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64  e is invalid and
17f20 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67   should be.** ig
17f30 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72  nored.  If the r
17f40 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e  owid cache has n
17f50 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
17f60 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20   set, then a.** 
17f70 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
17f80 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
17f90 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  64 sqlite3BtreeG
17fa0 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
17fb0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
17fc0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61   return pCur->ca
17fd0 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  chedRowid;.}../*
17fe0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
17ff0 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
18000 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
18010 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
18020 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
18030 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
18040 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
18050 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
18060 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
18070 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
18080 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
18090 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
180a0 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
180b0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
180c0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
180d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
180e0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
180f0 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 42      pBt->db = pB
18100 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 73 71  tree->db;.    sq
18110 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
18120 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
18130 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
18140 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
18150 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
18160 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
18170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
18180 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
18190 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
181a0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
181b0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
181c0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
181d0 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
181e0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
181f0 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
18200 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
18210 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
18220 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
18230 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
18240 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
18250 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
18260 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
18270 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
18280 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
18290 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
182a0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
182b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
182c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
182d0 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79  Make a temporary
182e0 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69   cursor by filli
182f0 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73  ng in the fields
18300 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a   of pTempCur..**
18310 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   The temporary c
18320 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20  ursor is not on 
18330 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20  the cursor list 
18340 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a  for the Btree..*
18350 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
18360 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
18370 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
18380 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70   BtCursor *pTemp
18390 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
183a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
183b0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
183c0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d  );.  memcpy(pTem
183d0 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65  pCur, pCur, size
183e0 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20  of(BtCursor));. 
183f0 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74   pTempCur->pNext
18400 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72   = 0;.  pTempCur
18410 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66  ->pPrev = 0;.  f
18420 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70  or(i=0; i<=pTemp
18430 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
18440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
18450 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e  erRef(pTempCur->
18460 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61  apPage[i]->pDbPa
18470 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
18480 74 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65  t( pTempCur->pKe
18490 79 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  y==0 );.}../*.**
184a0 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72   Delete a tempor
184b0 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20  ary cursor such 
184c0 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74  as was made by t
184d0 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61  he CreateTempora
184e0 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75  ryCursor().** fu
184f0 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f  nction above..*/
18500 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
18510 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
18520 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
18530 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
18540 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
18550 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
18560 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
18570 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
18580 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
18590 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 61  gerUnref(pCur->a
185a0 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67  pPage[i]->pDbPag
185b0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
185c0 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
185d0 79 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  y);.}..../*.** M
185e0 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
185f0 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
18600 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
18610 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
18620 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
18630 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
18640 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
18650 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65  , call.** sqlite
18660 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
18670 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
18680 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
18690 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
186a0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
186b0 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
186c0 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
186d0 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
186e0 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
186f0 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  f calls to sqlit
18700 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
18710 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
18720 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
18730 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
18740 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
18750 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
18760 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
18770 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
18780 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
18790 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
187a0 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
187b0 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
187c0 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
187d0 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
187e0 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
187f0 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
18800 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
18810 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
18820 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
18830 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
18840 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
18850 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
18860 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
18870 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
18880 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
18890 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
188a0 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
188b0 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
188c0 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
188d0 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
188e0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
188f0 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
18900 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
18910 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
18920 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
18930 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
18940 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
18950 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
18960 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
18970 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
18980 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
18990 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
189a0 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
189b0 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
189c0 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
189d0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
189e0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
189f0 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
18a00 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
18a10 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
18a20 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
18a30 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
18a40 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
18a50 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
18a60 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
18a70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
18a80 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
18a90 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
18aa0 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
18ab0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
18ac0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18ad0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
18ae0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
18af0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
18b00 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
18b10 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
18b20 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  NKey = 1;.    }e
18b30 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
18b40 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
18b50 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
18b60 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f   /* if not _MSC_
18b70 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20  VER */.  /* Use 
18b80 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f  a macro in all o
18b90 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73  ther compilers s
18ba0 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
18bb0 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a  ion is inlined *
18bc0 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c  /.#define getCel
18bd0 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20  lInfo(pCur)     
18be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
18c20 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c60 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67    \.    int iPag
18c70 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33     \.    sqlite3
18cc0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
18cd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
18ce0 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
18cf0 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
18d00 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e  o); \.    pCur->
18d10 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
18d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18da0 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
18db0 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
18dc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18df0 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
18e00 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
18e10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
18e20 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
18e30 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
18e40 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
18e50 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
18e60 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
18e70 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
18e80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
18e90 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
18ea0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
18eb0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
18ec0 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
18ed0 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
18ee0 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
18ef0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
18f00 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
18f10 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
18f20 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18f30 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
18f40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18f50 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
18f60 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
18f70 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
18f80 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
18f90 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
18fa0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
18fb0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
18fc0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
18fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18fe0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
18ff0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19000 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
19010 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19020 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
19030 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19040 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
19050 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
19060 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
19070 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
19080 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
19090 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
190a0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  o.nKey;.    }.  
190b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
190c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
190d0 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
190e0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
190f0 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
19100 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
19110 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
19120 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
19130 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
19140 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
19150 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20  ssible.  If the 
19160 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75  cursor is not cu
19170 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
19180 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  ing to an entry 
19190 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65  (which can happe
191a0 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
191b0 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  if.** the databa
191c0 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65  se is empty) the
191d0 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  n *pSize is set 
191e0 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
191f0 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
19200 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
19210 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
19220 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
19230 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19240 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
19250 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
19260 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
19270 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
19290 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
192a0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
192b0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
192c0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
192d0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
192e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
192f0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
19300 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
19310 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
19320 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
19330 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
19340 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
19350 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
19360 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
19370 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
19380 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
19390 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
193a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
193b0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
193c0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
193d0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
193e0 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
193f0 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
19400 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
19410 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
19420 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
19430 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
19440 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
19450 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
19460 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
19470 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
19480 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
19490 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
194a0 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
194b0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
194c0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
194d0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
194e0 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
194f0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
19500 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
19510 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
19520 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
19530 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
19540 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
19550 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
19560 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
19570 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
19580 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
19590 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
195a0 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
195b0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
195c0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
195d0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
195e0 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
195f0 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
19600 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
19610 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
19620 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
19630 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
19640 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
19650 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
19660 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
19670 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
19680 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
19690 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
196a0 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
196b0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
196c0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
196d0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
196e0 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
196f0 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
19700 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
19710 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
19720 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
19730 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
19740 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
19750 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
19760 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
19770 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
19780 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f  ed *pBt, .  Pgno
19790 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
197a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72           /* Over
197b0 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d  flow page */.  M
197c0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
197d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
197e0 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
197f0 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
19800 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
19810 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
19820 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
19830 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
19840 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
19850 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
19860 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
19870 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19880 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
19890 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
198a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
198b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
198c0 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
198d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
198e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
198f0 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
19900 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
19910 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
19920 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
19930 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
19940 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
19950 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
19960 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
19970 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
19980 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
19990 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
199a0 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
199b0 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
199c0 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
199d0 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
199e0 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
199f0 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
19a00 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
19a10 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
19a20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
19a30 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
19a40 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
19a50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
19a60 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
19a70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
19a80 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
19a90 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
19aa0 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
19ab0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
19ac0 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
19ad0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
19ae0 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63  uess<=pagerPagec
19af0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
19b00 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
19b10 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
19b20 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
19b30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19b40 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
19b50 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
19b60 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
19b70 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
19b80 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
19b90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
19ba0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
19bb0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
19bc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19bd0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
19be0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
19bf0 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
19c00 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
19c10 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
19c20 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
19c30 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
19c40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
19c50 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
19c60 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
19c70 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
19c80 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
19c90 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
19ca0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
19cb0 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
19cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
19cd0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
19ce0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
19cf0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
19d00 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
19d10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
19d20 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
19d30 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
19d40 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
19d50 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
19d60 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
19d70 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
19d80 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
19d90 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
19da0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
19db0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
19dc0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
19dd0 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
19de0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
19df0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
19e00 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
19e10 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
19e20 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
19e30 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
19e40 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
19e50 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
19e60 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
19e70 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
19e80 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
19e90 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
19ea0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
19eb0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
19ec0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
19ed0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
19ee0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
19ef0 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
19f00 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
19f10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
19f20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
19f30 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
19f40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
19f50 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
19f60 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f80 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
19f90 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
19fa0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
19fb0 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
19fc0 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
19fd0 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
19fe0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
19ff0 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1a000 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1a010 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1a020 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1a030 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1a040 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1a050 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1a060 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1a070 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1a080 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1a090 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1a0a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a0b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a0c0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1a0d0 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1a0e0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1a0f0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1a100 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1a110 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1a120 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1a130 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1a140 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1a150 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1a160 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1a170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a180 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1a190 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1a1a0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1a1b0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1a1c0 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1a1d0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1a1e0 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1a1f0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1a200 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1a210 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1a220 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1a230 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1a240 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1a250 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1a260 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1a270 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1a280 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1a290 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1a2a0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1a2b0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1a2c0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1a2d0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1a2e0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1a2f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a300 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
1a310 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
1a320 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
1a330 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
1a340 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
1a350 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
1a360 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
1a370 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
1a380 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1a390 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
1a3a0 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1a3b0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
1a3c0 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
1a3d0 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1a3e0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1a3f0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1a400 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1a410 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1a420 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1a430 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1a440 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1a450 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1a460 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1a470 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1a480 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1a490 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1a4a0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1a4b0 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1a4c0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1a4d0 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1a4e0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1a4f0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1a500 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1a510 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1a520 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1a530 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1a540 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1a550 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1a560 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1a570 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1a580 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1a590 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1a5a0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1a5b0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1a5c0 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1a5d0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1a5e0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1a5f0 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1a600 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1a610 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1a620 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1a630 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1a640 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1a650 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1a660 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1a670 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1a680 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1a690 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1a6a0 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1a6b0 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1a6c0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1a6d0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1a6e0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1a6f0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1a700 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1a710 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1a720 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1a730 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1a740 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1a750 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1a760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1a770 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1a780 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1a790 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1a7a0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1a7b0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1a7c0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
1a7d0 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
1a7e0 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
1a7f0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1a800 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1a810 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1a820 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1a830 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1a840 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1a850 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1a860 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1a870 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1a880 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1a890 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1a8a0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1a8b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1a8c0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1a8d0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1a8e0 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1a8f0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1a900 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1a910 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1a920 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1a930 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1a940 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1a950 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1a960 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1a970 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1a980 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1a990 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1a9a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1a9b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1a9c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1a9d0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1a9e0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1a9f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1aa00 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1aa10 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1aa20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1aa30 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1aa40 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1aa50 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1aa60 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
1aa70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
1aa80 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
1aa90 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a  ur->info.nData .
1aaa0 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
1aab0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1aac0 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
1aad0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
1aae0 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
1aaf0 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
1ab00 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
1ab10 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
1ab20 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
1ab30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ab40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ab50 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1ab60 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
1ab70 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
1ab80 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
1ab90 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
1aba0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
1abb0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1abc0 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
1abd0 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
1abe0 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
1abf0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
1ac00 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1ac10 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
1ac20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
1ac30 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1ac40 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
1ac50 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
1ac60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
1ac70 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1ac80 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
1ac90 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
1aca0 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
1acb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1acc0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
1acd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1ace0 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
1acf0 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
1ad00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1ad10 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
1ad20 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
1ad30 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
1ad40 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
1ad50 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
1ad60 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
1ad70 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1ad80 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1ad90 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1ada0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1adb0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1adc0 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
1add0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
1ade0 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
1adf0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1ae00 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
1ae10 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
1ae20 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
1ae30 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
1ae40 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
1ae50 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
1ae60 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1ae70 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
1ae80 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
1ae90 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1aea0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
1aeb0 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
1aec0 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
1aed0 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
1aee0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
1aef0 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
1af00 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
1af10 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
1af20 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
1af30 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1af40 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1af50 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1af60 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
1af70 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
1af80 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
1af90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1afa0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
1afb0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
1afc0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
1afd0 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
1afe0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
1aff0 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
1b000 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26      if( nOvfl &&
1b010 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1b020 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
1b030 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1b040 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1b050 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
1b060 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1b070 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1b080 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
1b090 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
1b0a0 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
1b0b0 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
1b0c0 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
1b0d0 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
1b0e0 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
1b0f0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1b100 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1b110 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
1b120 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
1b130 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
1b140 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
1b150 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1b160 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1b170 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
1b180 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
1b190 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
1b1a0 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
1b1b0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1b1c0 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
1b1d0 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
1b1e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b1f0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1b200 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
1b210 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
1b220 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1b230 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
1b240 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1b250 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1b260 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
1b270 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1b280 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
1b290 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
1b2a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
1b2b0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1b2c0 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
1b2d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1b2e0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
1b2f0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
1b300 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
1b310 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
1b320 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
1b330 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
1b340 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1b350 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
1b360 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1b370 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
1b380 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
1b390 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
1b3a0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
1b3b0 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
1b3c0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
1b3d0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
1b3e0 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
1b3f0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
1b400 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
1b410 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
1b420 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
1b430 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1b440 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1b450 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
1b460 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1b470 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1b480 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
1b490 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1b4a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1b4b0 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
1b4c0 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
1b4d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b4e0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1b4f0 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
1b500 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
1b510 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
1b520 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
1b530 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1b540 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
1b550 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
1b560 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
1b570 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
1b580 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
1b590 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
1b5a0 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
1b5b0 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
1b5c0 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
1b5d0 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
1b5e0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
1b5f0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1b600 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b610 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
1b620 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
1b630 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
1b640 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b660 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
1b670 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1b680 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
1b690 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1b6a0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
1b6b0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
1b6c0 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
1b6d0 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
1b6e0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
1b6f0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
1b700 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b710 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
1b720 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1b730 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
1b740 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
1b750 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1b760 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1b770 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1b780 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1b790 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
1b7a0 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
1b7b0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
1b7c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1b7d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1b7e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1b7f0 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1b800 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1b810 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1b820 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b830 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1b840 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
1b850 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1b860 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1b870 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1b880 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1b890 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1b8a0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1b8b0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1b8c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1b8d0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1b8e0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1b8f0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1b900 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1b910 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1b920 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1b930 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1b940 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1b950 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1b960 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1b970 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
1b980 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1b990 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1b9a0 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1b9b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1b9c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1b9d0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1b9e0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1b9f0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1ba00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ba10 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ba20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ba30 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1ba40 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1ba50 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1ba60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1ba70 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1ba80 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1ba90 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
1baa0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1bab0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1bac0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1bad0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1bae0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1baf0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1bb00 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1bb10 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1bb20 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1bb30 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1bb40 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20  *)pBuf, 0, 0);. 
1bb50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1bb60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1bb70 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1bb80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1bb90 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1bba0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1bbb0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1bbc0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1bbd0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1bbe0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1bbf0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1bc00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1bc10 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1bc20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1bc30 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1bc40 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1bc50 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1bc60 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1bc70 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1bc80 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1bc90 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1bca0 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1bcb0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1bcc0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1bcd0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1bce0 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1bcf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1bd00 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1bd10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1bd20 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1bd30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bd40 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1bd50 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1bd60 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1bd70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1bd80 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1bd90 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1bda0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bdb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1bdc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1bdd0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1bde0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1bdf0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1be00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1be10 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1be20 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1be30 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1be40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1be50 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1be60 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1be70 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1be80 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1be90 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
1bea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1beb0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1bec0 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1bed0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1bee0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1bef0 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1bf00 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1bf10 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1bf20 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1bf30 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1bf40 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1bf50 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1bf60 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1bf70 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1bf80 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1bf90 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1bfa0 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1bfb0 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1bfc0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1bfd0 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1bfe0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1bff0 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1c000 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1c010 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1c020 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1c030 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1c040 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1c050 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1c060 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1c070 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1c080 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1c090 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1c0a0 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1c0b0 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1c0c0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1c0d0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1c0e0 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1c0f0 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1c100 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1c110 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1c120 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1c130 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1c140 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
1c150 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
1c160 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
1c170 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
1c180 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
1c190 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
1c1a0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
1c1b0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1c1c0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
1c1d0 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
1c1e0 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
1c1f0 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
1c200 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1c210 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
1c220 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
1c230 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
1c240 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
1c250 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1c260 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
1c270 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
1c280 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1c290 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1c2a0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1c2b0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1c2c0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1c2d0 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
1c2e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
1c2f0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1c300 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
1c310 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
1c320 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
1c330 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
1c340 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
1c350 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1c360 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1c370 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1c380 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
1c390 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   u32 nLocal;..  
1c3a0 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
1c3b0 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
1c3c0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1c3d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1c3e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1c3f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c400 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1c410 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1c420 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
1c430 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1c440 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c450 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1c460 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1c470 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1c480 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
1c490 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1c4a0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1c4b0 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
1c4c0 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
1c4d0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
1c4e0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1c4f0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
1c500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
1c510 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
1c520 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1c530 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
1c540 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
1c550 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
1c560 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1c570 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
1c580 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
1c590 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1c5a0 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
1c5b0 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
1c5c0 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
1c5d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
1c5e0 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1c5f0 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1c600 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1c610 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1c620 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1c630 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1c640 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1c650 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1c660 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1c670 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1c680 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1c690 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1c6a0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1c6b0 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1c6c0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1c6d0 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1c6e0 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1c6f0 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1c700 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1c710 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1c720 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
1c730 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
1c740 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
1c750 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
1c760 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
1c770 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
1c780 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
1c790 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
1c7a0 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
1c7b0 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
1c7c0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1c7d0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1c7e0 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
1c7f0 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
1c800 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
1c810 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1c820 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
1c830 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
1c840 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
1c850 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
1c860 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
1c870 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1c880 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  t){.  assert( cu
1c890 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c8a0 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
1c8b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1c8c0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1c8d0 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
1c8e0 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
1c8f0 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
1c900 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1c910 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
1c920 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
1c930 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
1c940 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
1c950 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1c960 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1c970 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
1c980 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c990 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
1c9a0 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
1c9b0 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1c9c0 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
1c9d0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1c9e0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1c9f0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1ca00 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
1ca10 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
1ca20 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
1ca30 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
1ca40 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
1ca50 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73  to move to..*/.s
1ca60 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1ca70 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
1ca80 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
1ca90 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
1caa0 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
1cab0 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
1cac0 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
1cad0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1cae0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
1caf0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1cb00 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1cb10 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1cb20 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1cb30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1cb40 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
1cb50 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
1cb60 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1cb70 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
1cb80 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
1cb90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1cba0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1cbb0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
1cbc0 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
1cbd0 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b  gno, &pNewPage);
1cbe0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1cbf0 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
1cc00 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
1cc10 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
1cc20 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
1cc30 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
1cc40 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1cc50 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1cc60 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1cc70 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
1cc80 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72  nCell<1 ){.    r
1cc90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1cca0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1ccb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ccc0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  K;.}..#ifndef ND
1ccd0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
1cce0 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
1ccf0 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
1cd00 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
1cd10 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
1cd20 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
1cd30 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
1cd40 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
1cd50 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
1cd60 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
1cd70 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
1cd80 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
1cd90 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1cda0 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
1cdb0 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
1cdc0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
1cdd0 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
1cde0 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
1cdf0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
1ce00 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
1ce10 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
1ce20 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
1ce30 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
1ce40 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
1ce50 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
1ce60 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
1ce70 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
1ce80 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1ce90 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
1cea0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
1ceb0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
1cec0 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
1ced0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1cee0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1cef0 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
1cf00 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
1cf10 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
1cf20 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1cf30 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
1cf40 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1cf50 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
1cf60 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
1cf70 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
1cf80 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
1cf90 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
1cfa0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
1cfb0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
1cfc0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1cfd0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
1cfe0 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
1cff0 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
1d000 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
1d010 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1d020 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
1d030 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
1d040 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  ll index..*/.voi
1d050 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  d sqlite3BtreeMo
1d060 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
1d070 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
1d080 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1d090 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1d0a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1d0b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1d0c0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1d0d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
1d0e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d0f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1d100 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
1d110 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
1d120 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
1d130 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
1d140 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
1d150 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
1d160 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
1d170 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1d180 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c  >pgno.  );.  rel
1d190 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1d1a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1d1b0 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  e]);.  pCur->iPa
1d1c0 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ge--;.  pCur->in
1d1d0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1d1e0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1d1f0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  = 0;.}../*.** Mo
1d200 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1d210 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a   the root page.*
1d220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1d230 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
1d240 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
1d250 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
1d260 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d270 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
1d280 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
1d290 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1d2a0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
1d2b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1d2c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1d2d0 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
1d2e0 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
1d2f0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
1d300 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
1d310 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
1d320 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
1d330 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
1d340 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
1d350 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1d360 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1d370 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
1d380 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
1d390 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1d3a0 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
1d3b0 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
1d3c0 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20  >skip;.    }.   
1d3d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1d3e0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1d3f0 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
1d400 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
1d410 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1d420 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=1; i<=pCur->iP
1d430 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1d440 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1d450 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1d460 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1d470 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
1d480 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
1d490 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1d4a0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
1d4b0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
1d4c0 30 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  0])).    ){.    
1d4d0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1d4e0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1d4f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1d500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
1d510 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
1d520 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
1d530 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
1d540 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
1d550 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
1d560 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64   0;.  pCur->aiId
1d570 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
1d580 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1d590 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  ;.  pCur->atLast
1d5a0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1d5b0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
1d5c0 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
1d5d0 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c  ==0 && !pRoot->l
1d5e0 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1d5f0 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73  subpage;.    ass
1d600 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
1d610 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61  ==1 );.    subpa
1d620 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
1d630 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
1d640 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
1d650 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75  ;.    assert( su
1d660 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70  bpage>0 );.    p
1d670 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1d680 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
1d690 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1d6a0 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
1d6b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
1d6c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
1d6d0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Root->nCell>0)?C
1d6e0 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
1d6f0 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d  OR_INVALID);.  }
1d700 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d710 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1d720 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1d730 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1d740 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1d750 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
1d760 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1d770 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
1d780 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
1d790 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
1d7a0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
1d7b0 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
1d7c0 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
1d7d0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1d7e0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1d7f0 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
1d800 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1d810 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1d820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d830 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1d840 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d850 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d860 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1d870 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1d880 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1d890 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1d8a0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
1d8b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1d8c0 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
1d8d0 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1d8e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1d8f0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1d900 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
1d910 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
1d920 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1d930 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1d940 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
1d950 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1d960 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1d970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d980 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1d990 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1d9a0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
1d9b0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1d9c0 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
1d9d0 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1d9e0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
1d9f0 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
1da00 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
1da10 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1da20 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
1da30 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
1da40 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
1da50 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
1da60 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1da70 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
1da80 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
1da90 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1daa0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1dab0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1dac0 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
1dad0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1dae0 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
1daf0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
1db00 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
1db10 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
1db20 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1db30 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
1db40 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
1db50 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1db60 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1db70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1db80 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1db90 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1dba0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1dbb0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1dbc0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1dbd0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1dbe0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1dbf0 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1dc00 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1dc10 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
1dc20 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1dc30 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1dc40 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1dc50 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1dc60 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1dc70 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
1dc80 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
1dc90 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1dca0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1dcb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1dcc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
1dcd0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1dce0 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
1dcf0 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
1dd00 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1dd10 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1dd20 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
1dd30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1dd40 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1dd50 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1dd60 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1dd70 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1dd80 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1dd90 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1dda0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1ddb0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1ddc0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1ddd0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1dde0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1ddf0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1de00 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
1de10 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1de20 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1de30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1de40 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1de50 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1de60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1de70 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1de80 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1de90 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
1dea0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1deb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1ded0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1dee0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1def0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1df00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1df10 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
1df20 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1df30 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
1df40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1df50 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1df60 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1df70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1df80 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
1df90 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1dfa0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1dfb0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1dfc0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1dfd0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1dfe0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1dff0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1e000 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1e010 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
1e020 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
1e030 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
1e040 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
1e050 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
1e060 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
1e070 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
1e080 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1e090 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1e0a0 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
1e0b0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1e0c0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1e0d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1e0e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1e0f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1e100 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e110 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1e120 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1e130 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1e140 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1e150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e160 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1e170 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1e180 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
1e190 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1e1a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1e1b0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1e1c0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1e1d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1e1e0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e1f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e200 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1e210 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1e220 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
1e230 43 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74 43  Cur);.      getC
1e240 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1e250 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
1e260 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
1e270 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20  K ?1:0;.    }.  
1e280 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e290 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1e2a0 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
1e2b0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
1e2c0 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
1e2d0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1e2e0 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
1e2f0 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
1e300 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
1e310 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
1e320 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
1e330 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
1e340 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
1e350 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
1e360 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
1e370 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
1e380 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
1e390 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
1e3a0 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
1e3b0 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
1e3c0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1e3d0 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
1e3e0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1e3f0 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
1e400 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
1e410 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
1e420 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
1e430 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
1e440 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
1e450 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
1e460 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
1e470 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
1e480 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
1e490 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
1e4a0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
1e4b0 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
1e4c0 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
1e4d0 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
1e4e0 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
1e4f0 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
1e500 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
1e510 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
1e520 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
1e530 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
1e540 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1e550 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
1e560 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1e570 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1e580 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1e590 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
1e5a0 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
1e5b0 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
1e5c0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1e5d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e5e0 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
1e5f0 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
1e600 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
1e610 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
1e620 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
1e630 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1e640 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1e650 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
1e680 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
1e690 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
1e6a0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1e6b0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1e6c0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1e6d0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1e6e0 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
1e6f0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
1e700 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
1e710 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1e720 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
1e730 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1e740 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1e750 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
1e760 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
1e770 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
1e780 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
1e790 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
1e7a0 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
1e7b0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1e7c0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
1e7d0 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
1e7e0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
1e7f0 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
1e800 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1e810 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e830 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
1e840 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
1e850 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1e860 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e870 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e880 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e890 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1e8a0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1e8b0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
1e8c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
1e8d0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
1e8e0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
1e8f0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
1e900 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
1e910 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
1e920 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
1e930 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
1e940 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e950 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75  SOR_VALID && pCu
1e960 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20  r->validNKey .  
1e970 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
1e980 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29  [0]->intKey .  )
1e990 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1e9a0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
1e9b0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
1e9c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
1e9d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1e9e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
1e9f0 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72  ->atLast && pCur
1ea00 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
1ea10 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1ea20 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
1ea30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ea40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20      }.  }..  rc 
1ea50 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1ea60 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
1ea70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ea80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1ea90 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1eaa0 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
1eab0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1eac0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
1ead0 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70  sInit );.  if( p
1eae0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1eaf0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1eb00 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
1eb10 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1eb20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1eb30 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
1eb40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1eb50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
1eb60 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1eb70 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c  ge[0]->intKey ||
1eb80 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
1eb90 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
1eba0 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e  wr, upr;.    Pgn
1ebb0 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
1ebc0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
1ebd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1ebe0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e  ->iPage];.    in
1ebf0 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52  t c = -1;  /* pR
1ec00 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62  es return if tab
1ec10 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74  le is empty must
1ec20 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77   be -1 */.    lw
1ec30 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
1ec40 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
1ec50 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
1ec60 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64 78  ->intKey && pIdx
1ec70 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70 72 3c 30  Key==0) || upr<0
1ec80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1ec90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1eca0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
1ecb0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1ecc0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73    }.    if( bias
1ecd0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
1ece0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1ecf0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75  >iPage] = (u16)u
1ed00 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
1ed10 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
1ed20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1ed30 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f  (u16)((upr+lwr)/
1ed40 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  2);.    }.    fo
1ed50 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69  r(;;){.      voi
1ed60 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
1ed70 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
1ed80 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d  .      int idx =
1ed90 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1eda0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20  r->iPage];.     
1edb0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1edc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75  e = 0;.      pCu
1edd0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1ede0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
1edf0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
1ee00 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a       u8 *pCell;.
1ee10 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
1ee20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1ee30 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
1ee40 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
1ee50 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
1ee60 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
1ee70 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
1ee80 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
1ee90 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
1eea0 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  ell, dummy);.   
1eeb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
1eec0 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
1eed0 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
1eee0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
1eef0 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
1ef00 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1ef10 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
1ef20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
1ef30 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
1ef40 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
1ef50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ef60 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
1ef70 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  Key>intKey );.  
1ef80 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
1ef90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1efa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1efb0 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20  nt available;.  
1efc0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
1efd0 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61   (void *)fetchPa
1efe0 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61  yload(pCur, &ava
1eff0 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  ilable, 0);.    
1f000 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70      nCellKey = p
1f010 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1f020 20 20 20 20 20 20 20 20 69 66 28 20 61 76 61 69          if( avai
1f030 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20  lable>=nCellKey 
1f040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1f050 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1f060 72 64 43 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e  rdCompare((int)n
1f070 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1f080 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
1f090 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f0a0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
1f0b0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
1f0c0 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (int)nCellKey );
1f0d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1f0e0 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
1f0f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1f100 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1f110 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
1f120 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1f130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f140 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1f150 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
1f160 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20   (int)nCellKey, 
1f170 28 76 6f 69 64 2a 29 70 43 65 6c 6c 4b 65 79 29  (void*)pCellKey)
1f180 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
1f190 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1f1a0 64 43 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e 43  dCompare((int)nC
1f1b0 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1f1c0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
1f1d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1f1e0 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
1f1f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1f200 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1f210 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
1f220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f230 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
1f240 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1f250 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
1f260 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1f270 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
1f280 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1f290 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
1f2a0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c           upr = l
1f2b0 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  wr - 1;.        
1f2c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1f2d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f2e0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1f2f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1f300 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1f310 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1f320 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
1f330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f340 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
1f350 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
1f360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f370 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
1f380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f390 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20   lwr>upr ){.    
1f3a0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1f3b0 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
1f3c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1f3d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
1f3e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1f3f0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 6c  Page] = (u16)((l
1f400 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20  wr+upr)/2);.    
1f410 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
1f420 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20  r==upr+1 );.    
1f430 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1f440 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
1f450 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1f460 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
1f470 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1f480 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
1f490 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
1f4a0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
1f4b0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1f4c0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1f4d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f4e0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1f4f0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1f500 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
1f510 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
1f520 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1f530 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1f540 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1f550 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f560 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1f570 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20  .      if( pRes 
1f580 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20  ) *pRes = c;.   
1f590 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1f5a0 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
1f5b0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1f5c0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
1f5d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1f5e0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
1f5f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1f600 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
1f610 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1f620 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1f630 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
1f640 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1f650 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1f660 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  sh;.  }.moveto_f
1f670 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20  inish:.  return 
1f680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20  rc;.}../*.** In 
1f690 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  this version of 
1f6a0 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65  BtreeMoveto, pKe
1f6b0 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e  y is a packed in
1f6c0 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75  dex record.** su
1f6d0 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74  ch as is generat
1f6e0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1f6f0 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20  eRecord opcode. 
1f700 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72   Unpack the.** r
1f710 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63  ecord and then c
1f720 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55  all BtreeMovetoU
1f730 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20  npacked() to do 
1f740 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74  the work..*/.int
1f750 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1f760 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20  eto(.  BtCursor 
1f770 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75  *pCur,     /* Cu
1f780 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  rsor open on the
1f790 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61   btree to be sea
1f7a0 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rched */.  const
1f7b0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
1f7c0 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20  * Packed key if 
1f7d0 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20  the btree is an 
1f7e0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e  index */.  i64 n
1f7f0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
1f800 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  * Integer key fo
1f810 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20  r tables.  Size 
1f820 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69  of pKey for indi
1f830 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  ces */.  int bia
1f840 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
1f850 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74  Bias search to t
1f860 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
1f870 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
1f880 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
1f890 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
1f8a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1f8b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f8c0 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63       /* Status c
1f8d0 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ode */.  Unpacke
1f8e0 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
1f8f0 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ;   /* Unpacked 
1f900 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 55  index key */.  U
1f910 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 61 53  npackedRecord aS
1f920 70 61 63 65 5b 31 36 5d 3b 20 2f 2a 20 54 65 6d  pace[16]; /* Tem
1f930 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78  p space for pIdx
1f940 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  Key - to avoid a
1f950 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66   malloc */..  if
1f960 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
1f970 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
1f980 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
1f990 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
1f9a0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1f9b0 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
1f9c0 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
1f9d0 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9f0 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61 63             aSpac
1fa00 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65  e, sizeof(aSpace
1fa10 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  ));.    if( pIdx
1fa20 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
1fa30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1fa40 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
1fa50 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
1fa60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
1fa70 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
1fa80 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
1fa90 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
1faa0 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
1fab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
1fac0 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
1fad0 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a  d(pIdxKey);.  }.
1fae0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1faf0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1fb00 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
1fb10 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
1fb20 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
1fb30 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
1fb40 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
1fb50 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
1fb60 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
1fb70 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
1fb80 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
1fb90 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
1fba0 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
1fbb0 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
1fbc0 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
1fbd0 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
1fbe0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
1fbf0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1fc00 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1fc10 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
1fc20 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1fc30 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
1fc40 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1fc50 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
1fc60 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
1fc70 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
1fc80 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
1fc90 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
1fca0 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
1fcb0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
1fcc0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
1fcd0 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
1fce0 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
1fcf0 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
1fd00 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
1fd10 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
1fd20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1fd30 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1fd40 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f  ection handle fo
1fd50 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  r a cursor..*/.s
1fd60 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42  qlite3 *sqlite3B
1fd70 74 72 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e  treeCursorDb(con
1fd80 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st BtCursor *pCu
1fd90 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  r){.  assert( sq
1fda0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1fdb0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1fdc0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1fdd0 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72  eturn pCur->pBtr
1fde0 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee->db;.}../*.**
1fdf0 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
1fe00 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
1fe10 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1fe20 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
1fe30 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
1fe40 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
1fe50 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
1fe60 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
1fe70 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
1fe80 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1fe90 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
1fea0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
1feb0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
1fec0 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
1fed0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1fee0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1fef0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1ff00 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
1ff10 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1ff20 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1ff30 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1ff40 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1ff50 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
1ff60 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1ff70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ff80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1ff90 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
1ffa0 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66   pRes!=0 );.  if
1ffb0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1ffc0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1ffd0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
1ffe0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1fff0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
20000 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b   pCur->skip>0 ){
20010 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
20020 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
20030 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
20040 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
20050 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
20060 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
20070 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20080 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
20090 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
200a0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
200b0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
200c0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t );.  assert( i
200d0 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx<=pPage->nCell
200e0 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66   );..  pCur->inf
200f0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
20100 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
20110 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70   0;.  if( idx>=p
20120 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
20130 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
20140 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
20150 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
20160 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
20170 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
20180 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
20190 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
201a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
201b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
201c0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
201d0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
201e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
201f0 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
20200 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
20210 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
20220 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
20230 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
20240 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
20250 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
20260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
20270 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
20280 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
20290 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
202a0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
202b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
202c0 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
202d0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
202e0 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
202f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
20300 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
20310 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
20320 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20330 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
20340 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
20350 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
20360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20370 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
20380 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
20390 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
203a0 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
203b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
203c0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65  .  rc = moveToLe
203d0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
203e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
203f0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
20400 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
20410 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
20420 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
20430 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
20440 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
20450 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
20460 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
20470 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
20480 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
20490 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
204a0 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
204b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
204c0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
204d0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
204e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
204f0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
20500 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
20510 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
20520 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
20530 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
20540 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
20550 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
20560 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
20570 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
20580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20590 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
205a0 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  }.  pCur->atLast
205b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53   = 0;.  if( CURS
205c0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
205d0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
205e0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
205f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20600 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
20610 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70  >skip<0 ){.    p
20620 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
20630 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
20640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20650 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
20660 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
20670 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
20680 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
20690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
206a0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
206b0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
206c0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
206d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
206e0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
206f0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
20700 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
20710 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
20720 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
20730 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20740 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
20750 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
20760 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
20770 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
20780 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20790 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
207a0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
207b0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
207c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
207d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
207e0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
207f0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
20800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
20810 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
20820 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
20830 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
20840 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
20850 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
20860 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
20870 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   0;..    pCur->a
20880 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20890 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
208a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
208b0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
208c0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
208d0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
208e0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
208f0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
20900 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
20910 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20920 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
20930 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
20940 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
20950 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20960 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
20970 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
20980 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
20990 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
209a0 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
209b0 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
209c0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
209d0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
209e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
209f0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
20a00 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
20a10 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
20a20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
20a30 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
20a40 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
20a50 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
20a60 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
20a70 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
20a80 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
20a90 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
20aa0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20ab0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
20ac0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
20ad0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
20ae0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
20af0 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
20b00 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
20b10 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
20b20 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
20b30 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
20b40 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
20b50 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
20b60 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
20b70 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
20b80 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
20b90 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
20ba0 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
20bb0 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
20bc0 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
20bd0 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
20be0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
20bf0 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
20c00 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
20c10 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
20c20 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
20c30 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
20c40 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
20c50 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
20c60 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
20c70 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
20c80 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
20c90 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
20ca0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
20cb0 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
20cc0 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
20cd0 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
20ce0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
20cf0 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
20d00 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
20d10 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
20d20 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
20d30 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
20d40 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
20d50 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
20d60 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
20d70 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
20d80 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
20d90 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
20da0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
20db0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
20dc0 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
20dd0 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
20de0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
20df0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
20e00 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
20e10 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
20e20 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
20e30 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt k;     /* Num
20e40 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
20e50 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
20e60 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
20e70 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
20e80 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
20e90 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
20ea0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20eb0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
20ec0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
20ed0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
20ee0 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  ge1;.  n = get4b
20ef0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
20f00 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
20f10 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
20f20 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
20f30 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
20f40 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
20f50 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
20f60 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
20f70 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
20f80 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
20f90 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
20fa0 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
20fb0 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
20fc0 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
20fd0 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
20fe0 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
20ff0 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
21000 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
21010 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
21020 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
21030 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
21040 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
21050 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
21060 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
21070 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
21080 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
21090 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
210a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
210b0 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
210c0 62 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  by<=pagerPagecou
210d0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
210e0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
210f0 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
21100 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
21110 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
21120 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  um );.      rc =
21130 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
21140 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
21150 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
21160 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
21170 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
21180 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
21190 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  {.        search
211a0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
211b0 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  }.      *pPgno =
211c0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23   nearby;.    }.#
211d0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
211e0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
211f0 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
21200 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
21210 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
21220 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
21230 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
21240 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
21250 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
21260 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
21270 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
21280 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
21290 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
212a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
212b0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
212c0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
212d0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
212e0 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
212f0 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
21300 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
21310 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
21320 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
21330 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
21340 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
21350 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
21360 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
21370 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
21380 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
21390 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20  ' is located..  
213a0 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
213b0 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
213c0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
213d0 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
213e0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
213f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
21400 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
21410 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21420 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
21430 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
21440 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
21450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
21460 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
21470 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
21480 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
21490 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
214a0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
214b0 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
214c0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
214d0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
214e0 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
214f0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
21500 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
21510 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
21520 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
21530 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
21540 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
21550 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
21560 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
21570 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
21580 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
21590 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
215a0 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
215b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
215c0 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
215d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
215e0 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
215f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21600 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
21610 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
21620 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
21630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
21640 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
21650 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
21660 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
21670 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
21680 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
21690 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
216a0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
216b0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
216c0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
216d0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
216e0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
216f0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
21700 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
21710 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
21720 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
21730 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74   }else if( k>pBt
21740 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
21750 20 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   2 ){.        /*
21760 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
21770 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
21780 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
21790 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
217a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
217b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
217c0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
217d0 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
217e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
217f0 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
21800 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
21810 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
21820 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
21830 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
21840 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
21850 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
21860 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
21870 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
21880 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
21890 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
218a0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
218b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
218c0 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
218d0 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
218e0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
218f0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
21900 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
21910 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21920 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
21930 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21940 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
21950 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
21960 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
21970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21980 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
21990 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
219a0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
219b0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
219c0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
219d0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
219e0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
219f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21a00 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
21a10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
21a20 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
21a30 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
21a40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
21a50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
21a60 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
21a70 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
21a80 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
21a90 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
21aa0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
21ab0 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
21ac0 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
21ad0 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
21ae0 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
21af0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
21b00 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
21b10 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
21b20 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
21b30 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
21b40 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
21b50 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
21b60 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
21b70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21b80 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
21b90 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
21ba0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
21bb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21bc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21bd0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
21be0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
21bf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21c10 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
21c20 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
21c30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
21c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21c50 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
21c60 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
21c70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
21c80 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
21c90 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
21ca0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
21cb0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
21cc0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
21cd0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
21ce0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
21cf0 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
21d00 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
21d10 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
21d20 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
21d30 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
21d40 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
21d50 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
21d60 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
21d70 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
21d80 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
21d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
21da0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
21db0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
21dc0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
21dd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
21de0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
21df0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
21e00 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
21e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21e20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21e30 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
21e40 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
21e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21e60 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
21e70 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
21e80 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
21e90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21ea0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
21eb0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
21ec0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
21ed0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
21ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21ef0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
21f00 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
21f10 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
21f20 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
21f30 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
21f40 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
21f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21f60 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
21f70 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
21f80 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
21f90 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20   int closest;.  
21fa0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
21fb0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
21fc0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
21fd0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
21fe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21ff0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22000 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
22010 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
22020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
22030 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
22040 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
22050 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
22060 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
22070 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20   int i, dist;.  
22080 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
22090 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
220a0 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
220b0 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
220c0 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  by;.          if
220d0 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20  ( dist<0 ) dist 
220e0 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20  = -dist;.       
220f0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
22100 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
22110 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34     int d2 = get4
22120 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
22130 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  4]) - nearby;.  
22140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
22150 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20  <0 ) d2 = -d2;. 
22160 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
22170 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
22180 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
22190 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
221a0 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
221b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
221c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
221d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
221e0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
221f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
22200 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
22210 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
22220 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
22230 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
22240 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
22250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
22260 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
22270 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67         Pgno nPag
22280 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  e;.          *pP
22290 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
222a0 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70         nPage = p
222b0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
222c0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
222d0 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29  ( *pPgno>nPage )
222e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
222f0 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74   Free page off t
22300 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
22310 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
22320 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
22330 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
22340 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
22350 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
22360 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22370 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
22380 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
22390 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
223a0 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
223b0 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
223c0 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
223d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
223e0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
223f0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
22400 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
22410 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
22420 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
22430 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
22440 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
22450 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
22460 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
22470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
22480 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
22490 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
224a0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
224b0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
224c0 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  le(pTrunk->pDbPa
224d0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
224e0 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
224f0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
22500 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20  (pBt, *pPgno);. 
22510 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
22520 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
22530 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
22540 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
22550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22570 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
22580 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
22590 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
225a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
225b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
225c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
225d0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
225e0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
225f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22610 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
22620 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
22630 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
22640 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
22650 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
22660 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
22670 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
22680 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
22690 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
226a0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
226b0 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74  eelist, so creat
226c0 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20  e a new page at 
226d0 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  the.    ** end o
226e0 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
226f0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61    int nPage = pa
22700 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
22710 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
22720 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20  nPage + 1;..    
22730 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44  if( *pPgno==PEND
22740 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
22750 74 29 20 29 7b 0a 20 20 20 20 20 20 28 2a 70 50  t) ){.      (*pP
22760 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23  gno)++;.    }..#
22770 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22780 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
22790 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
227a0 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
227b0 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67  ISPAGE(pBt, *pPg
227c0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  no) ){.      /* 
227d0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
227e0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
227f0 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
22800 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
22810 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
22820 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
22830 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
22840 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
22850 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
22860 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
22870 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
22880 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
22890 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
228a0 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
228b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
228c0 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
228d0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
228e0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
228f0 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
22900 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  e)\n", *pPgno));
22910 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
22920 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
22930 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
22940 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22950 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
22960 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50  pBt, *pPgno, &pP
22970 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
22980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22990 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
229a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
229b0 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
229c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
229d0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
229e0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
229f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
22a00 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
22a10 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
22a20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
22a30 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e  E(pBt) ){ (*pPgn
22a40 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  o)++; }.    }.#e
22a50 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
22a60 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
22a70 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
22a80 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
22a90 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
22aa0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
22ab0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
22ac0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
22ad0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
22ae0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
22af0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
22b00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
22b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22b20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
22b30 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
22b40 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
22b50 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
22b60 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
22b70 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
22b80 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
22b90 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
22ba0 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
22bb0 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
22bc0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
22bd0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
22be0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66  PrevTrunk);.  if
22bf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22c00 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
22c10 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
22c20 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
22c30 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
22c40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
22c50 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  ppPage);.      r
22c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
22c70 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
22c80 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
22c90 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
22ca0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22cb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
22cc0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
22cd0 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
22ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22cf0 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
22d00 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
22d10 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
22d20 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
22d30 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
22d40 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
22d50 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
22d60 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
22d70 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
22d80 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
22d90 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
22da0 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
22db0 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
22dc0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
22dd0 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
22de0 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
22df0 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
22e00 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
22e10 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
22e20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
22e30 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
22e40 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
22e50 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
22e60 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
22e70 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
22e80 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
22e90 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
22ea0 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
22eb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
22ec0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
22ed0 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
22ee0 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
22ef0 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
22f00 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
22f10 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f30 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
22f40 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
22f50 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f70 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
22f80 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
22f90 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
22fa0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
22fb0 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
22fc0 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
22fd0 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
22fe0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
23010 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
23020 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
23030 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
23060 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23080 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
23090 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
230a0 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
230b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
230c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
230d0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
230e0 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
230f0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
23100 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
23110 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
23120 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
23130 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
23140 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
23150 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
23160 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
23170 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23180 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
23190 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
231a0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
231b0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
231c0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
231d0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
231e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
231f0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
23200 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
23210 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
23220 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
23230 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
23240 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
23250 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
23260 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
23270 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  1);..#ifdef SQLI
23280 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
23290 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
232a0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
232b0 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
232c0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
232d0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61  , then.  ** alwa
232e0 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
232f0 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
23300 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
23310 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21  s..  */.  if( (!
23320 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20 73  pPage && (rc = s
23330 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
23340 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
23350 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c  pPage, 0))).   |
23360 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 72 63  |            (rc
23370 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23380 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
23390 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67  age)).  ){.    g
233a0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
233b0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
233c0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
233d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
233e0 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Size);.#endif.. 
233f0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
23400 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
23410 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
23420 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
23430 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
23440 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
23450 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
23460 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
23470 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
23480 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
23490 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
234a0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
234b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
234c0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
234d0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
234e0 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
234f0 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
23500 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
23510 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
23520 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
23530 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
23540 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
23550 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
23560 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
23570 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
23580 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
23590 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
235a0 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
235b0 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
235c0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
235d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
235e0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
235f0 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
23600 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
23610 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
23620 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
23630 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
23640 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
23650 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
23660 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
23670 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
23680 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
23690 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 3b  {.    int nLeaf;
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236b0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
236c0 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
236d0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
236e0 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
236f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
23700 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
23710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
23720 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
23730 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
23740 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
23750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23760 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
23770 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
23780 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
23790 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
237a0 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  [4]);.    if( nL
237b0 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  eaf<0 ){.      r
237c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
237d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
237e0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
237f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23800 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c  nLeaf<pBt->usabl
23810 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
23820 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
23830 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
23840 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
23850 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
23860 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
23870 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
23880 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
23890 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
238a0 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
238b0 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
238c0 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
238d0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
238e0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
238f0 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
23900 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
23910 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
23920 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
23930 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
23940 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
23950 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
23960 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
23970 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
23980 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
23990 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
239a0 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
239b0 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
239c0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
239d0 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
239e0 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
239f0 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
23a00 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
23a10 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
23a20 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
23a30 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
23a40 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
23a50 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
23a60 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74  tain to restrict
23a70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
23a80 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
23a90 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
23aa0 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
23ab0 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
23ac0 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
23ad0 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
23ae0 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
23af0 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
23b00 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
23b10 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
23b20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
23b30 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
23b40 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
23b50 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
23b60 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
23b70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23b80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23b90 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
23ba0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
23bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
23bd0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
23be0 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
23bf0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
23c00 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
23c10 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
23c20 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  age);.#ifndef SQ
23c30 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
23c40 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  TE.        if( p
23c50 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
23c60 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
23c70 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
23c80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
23c90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
23ca0 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
23cb0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
23cc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
23cd0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
23ce0 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
23cf0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
23d00 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
23d10 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
23d20 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
23d30 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
23d40 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
23d50 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
23d60 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
23d70 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
23d80 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
23d90 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
23da0 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
23db0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
23dc0 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
23dd0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
23de0 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
23df0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
23e00 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
23e10 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
23e20 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
23e30 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
23e40 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
23e50 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
23e60 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
23e70 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
23e80 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
23e90 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
23ea0 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
23eb0 20 69 66 28 20 20 20 28 28 21 70 50 61 67 65 29   if(   ((!pPage)
23ec0 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20   && (0 != (rc = 
23ed0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
23ee0 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
23ef0 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a 20 20  &pPage, 0)))).  
23f00 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
23f10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
23f20 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
23f30 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 67  ge))).  ){.    g
23f40 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
23f50 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
23f60 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
23f70 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
23f80 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
23f90 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
23fa0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
23fb0 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
23fc0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
23fd0 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
23fe0 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
23ff0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
24000 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
24010 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
24020 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
24030 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
24040 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
24050 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
24060 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
24070 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
24080 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
24090 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
240a0 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
240b0 6e 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  n freePage2(pPag
240c0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
240d0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a  Page->pgno);.}..
240e0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
240f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
24100 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
24110 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
24120 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
24130 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
24140 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
24150 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
24160 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
24170 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
24180 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
24190 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
241a0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
241b0 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50 61  fl;.  u16 ovflPa
241c0 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
241d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
241e0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
241f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
24200 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
24210 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
24220 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
24230 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
24240 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
24250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
24260 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
24270 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
24280 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
24290 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
242a0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
242b0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
242c0 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72  rflow]);.  asser
242d0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
242e0 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
242f0 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
24300 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
24310 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
24320 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
24330 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
24340 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
24350 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
24360 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
24370 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
24380 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
24390 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
243a0 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
243b0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
243c0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30   if( ovflPgno==0
243d0 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67   || ovflPgno>pag
243e0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
243f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24400 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24410 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
24420 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
24430 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
24440 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
24450 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
24460 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
24470 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
24480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
24490 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
244a0 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
244b0 3b 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ;.    if( pOvfl 
244c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
244d0 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
244e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
244f0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
24500 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
24510 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
24520 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
24530 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
24540 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
24550 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
24560 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
24570 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
24580 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
24590 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
245a0 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
245b0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
245c0 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
245d0 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
245e0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
245f0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
24600 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
24610 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
24620 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
24630 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
24640 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
24650 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
24660 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
24670 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
24680 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
24690 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
246a0 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
246b0 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
246c0 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
246d0 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
246e0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
246f0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
24700 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
24710 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
24720 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
24730 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
24740 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
24750 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
24760 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
24770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
24780 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
24790 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
247a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
247b0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
247c0 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
247d0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
247e0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
247f0 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
24800 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
24810 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
24820 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
24830 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
24840 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24860 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
24870 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
24880 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
24890 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
248a0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
248b0 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
248c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
248d0 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
248e0 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
248f0 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
24900 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
24910 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
24920 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
24930 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
24940 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
24950 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
24960 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
24970 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
24980 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
24990 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
249a0 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
249b0 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
249c0 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
249d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
249e0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
249f0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
24a00 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
24a10 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
24a20 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
24a30 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
24a40 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
24a50 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
24a60 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
24a70 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
24a80 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
24a90 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
24aa0 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
24ab0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
24ac0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
24ad0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
24ae0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
24af0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
24b00 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
24b10 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
24b20 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  eader = 0;.  if(
24b30 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
24b40 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
24b50 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  4;.  }.  if( pPa
24b60 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
24b70 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
24b80 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
24b90 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e  Header], nData+n
24ba0 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Zero);.  }else{.
24bb0 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72      nData = nZer
24bc0 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65  o = 0;.  }.  nHe
24bd0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
24be0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
24bf0 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
24c00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
24c10 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
24c20 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
24c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
24c40 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64  o.nHeader==nHead
24c50 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
24c60 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
24c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
24c80 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e  o.nData==(u32)(n
24c90 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20  Data+nZero) );. 
24ca0 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
24cb0 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
24cc0 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
24cd0 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
24ce0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
24cf0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
24d00 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
24d10 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
24d20 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
24d30 20 20 69 66 28 20 6e 4b 65 79 3e 30 78 37 66 66    if( nKey>0x7ff
24d40 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30  fffff || pKey==0
24d50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24d60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
24d70 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
24d80 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79  oad += (int)nKey
24d90 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65  ;.    pSrc = pKe
24da0 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69  y;.    nSrc = (i
24db0 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a  nt)nKey;.  }.  *
24dc0 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53  pnSize = info.nS
24dd0 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74  ize;.  spaceLeft
24de0 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a   = info.nLocal;.
24df0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
24e00 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20  ell[nHeader];.  
24e10 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
24e20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b  info.iOverflow];
24e30 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  ..  while( nPayl
24e40 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
24e50 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
24e60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24e70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
24e80 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
24e90 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
24ea0 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
24eb0 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
24ec0 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
24ed0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
24ee0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
24ef0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
24f00 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
24f10 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
24f20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
24f30 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
24f40 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
24f50 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
24f60 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
24f70 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
24f80 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
24f90 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
24fa0 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
24fb0 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
24fc0 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
24fd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24fe0 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
24ff0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
25000 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
25010 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
25020 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
25030 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
25040 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
25050 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
25060 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
25070 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
25080 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
25090 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
250a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
250b0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
250c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
250d0 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
250e0 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
250f0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
25100 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
25110 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
25120 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
25130 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
25140 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
25150 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
25160 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
25170 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
25180 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
25190 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
251a0 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20  tialised values 
251b0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
251c0 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
251d0 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
251e0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
251f0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
25200 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
25210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25220 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
25230 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
25240 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
25250 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
25260 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
25270 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
25280 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
25290 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20  noPtrmap);.     
252a0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
252b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
252c0 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
252d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
252e0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
252f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
25300 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
25310 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
25320 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
25330 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
25340 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
25350 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
25360 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
25370 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
25380 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
25390 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
253a0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
253b0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
253c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
253d0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
253e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
253f0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
25400 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
25410 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
25420 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
25430 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
25440 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
25450 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
25460 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
25470 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
25480 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
25490 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
254a0 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
254b0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
254c0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
254d0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
254e0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
254f0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
25500 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
25510 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
25520 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
25530 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
25540 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
25550 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
25560 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
25570 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
25580 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
25590 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
255a0 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
255b0 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
255c0 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
255d0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
255e0 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
255f0 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
25600 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
25610 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20  ceLeft;..    /* 
25620 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
25630 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
25640 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69  Payload points i
25650 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
25660 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52  a.    ** of pToR
25670 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
25680 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
25690 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
256a0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
256b0 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
256c0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
256d0 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
256e0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
256f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61  ;..    /* If pPa
25700 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66  yload is part of
25710 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
25720 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
25730 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
25740 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
25750 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61  iteable */.    a
25760 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c  ssert( pPayload<
25770 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
25780 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65  pPayload>=&pPage
25790 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
257a0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
257b0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
257c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
257d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
257e0 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ..    if( nSrc>0
257f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
25800 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
25810 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25820 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
25830 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
25840 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
25850 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
25860 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
25870 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
25880 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
25890 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
258a0 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
258b0 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
258c0 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
258d0 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
258e0 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
258f0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
25900 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
25910 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
25920 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
25930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25940 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  K;.}../*.** Remo
25950 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  ve the i-th cell
25960 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68   from pPage.  Th
25970 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63  is routine effec
25980 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a  ts pPage only..*
25990 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * The cell conte
259a0 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20  nt is not freed 
259b0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  or deallocated. 
259c0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
259d0 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20  hat.** the cell 
259e0 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
259f0 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63   copied someplac
25a00 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f  e else.  This ro
25a10 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65  utine just.** re
25a20 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65  moves the refere
25a30 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  nce to the cell 
25a40 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  from pPage..**.*
25a50 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74  * "sz" must be t
25a60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
25a70 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a  es in the cell..
25a80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 72  */.static int dr
25a90 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
25aa0 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
25ab0 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69  int sz){.  int i
25ac0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
25ad0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
25ae0 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
25af0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
25b00 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
25b10 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
25b20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
25b30 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
25b40 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
25b50 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
25b60 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
25b70 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
25b80 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ta[] */.  int rc
25b90 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
25ba0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
25bb0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
25bc0 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
25bd0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
25be0 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
25bf0 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
25c00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25c10 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
25c20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
25c30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
25c40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25c50 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
25c60 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
25c70 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
25c80 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
25c90 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
25ca0 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
25cb0 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
25cc0 69 66 28 20 28 70 63 3c 70 50 61 67 65 2d 3e 68  if( (pc<pPage->h
25cd0 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67  drOffset+6+(pPag
25ce0 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20  e->leaf?0:4)).  
25cf0 20 20 20 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61     || (pc+sz>pPa
25d00 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
25d10 69 7a 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ize) ){.    retu
25d20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
25d30 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
25d40 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
25d50 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
25d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25d70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
25d80 63 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69  c;.  }.  for(i=i
25d90 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  dx+1; i<pPage->n
25da0 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d  Cell; i++, ptr+=
25db0 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d  2){.    ptr[0] =
25dc0 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72   ptr[2];.    ptr
25dd0 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20  [1] = ptr[3];.  
25de0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
25df0 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
25e00 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
25e10 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d  ffset+3], pPage-
25e20 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
25e30 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
25e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25e50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
25e60 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
25e70 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
25e80 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
25e90 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
25ea0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
25eb0 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
25ec0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
25ed0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
25ee0 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
25ef0 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
25f00 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
25f10 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
25f20 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
25f30 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
25f40 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
25f50 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
25f60 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
25f70 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
25f80 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
25f90 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
25fa0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
25fb0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
25fc0 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
25fd0 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
25fe0 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
25ff0 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
26000 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
26010 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
26020 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
26030 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
26040 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
26050 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
26060 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
26070 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
26080 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
26090 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
260a0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
260b0 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
260c0 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
260d0 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
260e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
260f0 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
26100 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
26110 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
26120 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
26130 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
26140 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
26150 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
26160 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
26170 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43  atic int insertC
26180 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
26190 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
261a0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
261b0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
261c0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
261d0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
261e0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
261f0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
26200 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
26210 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
26220 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
26230 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
26240 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
26250 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
26260 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
26270 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
26280 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
26290 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
262a0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20   needed */.  u8 
262b0 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f  nSkip          /
262c0 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  * Do not write t
262d0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
262e0 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
262f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
26300 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
26310 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
26320 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
26330 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
26340 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
26350 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
26360 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
26370 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
26380 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66  yte of content f
26390 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64  or any cell in d
263a0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65  ata[] */.  int e
263b0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
263c0 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
263d0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
263e0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
263f0 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
26400 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26410 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
26420 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
26430 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
26440 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
26450 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
26460 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65  to data[] of the
26470 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
26480 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
26490 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
264a0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
264b0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
264c0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
264d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
264e0 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
264f0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
26500 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
26510 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
26520 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
26530 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
26540 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
26550 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
26560 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
26570 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
26580 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
26590 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
265a0 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
265b0 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
265c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
265d0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
265e0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
265f0 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  >aOvfl) );.  ass
26600 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
26610 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
26620 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
26630 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
26640 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
26650 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
26660 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
26670 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
26680 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
26690 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
266a0 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69  emcpy(pTemp+nSki
266b0 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  p, pCell+nSkip, 
266c0 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20  sz-nSkip);.     
266d0 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
266e0 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
266f0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
26700 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
26710 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
26720 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
26730 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
26740 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ])) );.    pPage
26750 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
26760 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
26770 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
26780 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20  x = (u16)i;.    
26790 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30  pPage->nFree = 0
267a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
267b0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
267c0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
267d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
267e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
267f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
26800 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
26810 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
26820 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
26830 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
26840 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
26850 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68  ge->aData;.    h
26860 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
26870 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d  ffset;.    top =
26880 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
26890 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c  hdr+5]);.    cel
268a0 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
268b0 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
268c0 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
268d0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
268e0 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20  ll + 2;.    ins 
268f0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
26900 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20  *i;.    if( end 
26910 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20  > top - sz ){.  
26920 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
26930 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
26940 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26960 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26970 20 20 20 20 7d 0a 20 20 20 20 20 20 74 6f 70 20      }.      top 
26980 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
26990 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
269a0 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a  assert( end + sz
269b0 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d   <= top );.    }
269c0 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63  .    idx = alloc
269d0 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
269e0 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  sz);.    assert(
269f0 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73   idx>0 );.    as
26a00 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74  sert( end <= get
26a10 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
26a20 35 5d 29 20 29 3b 0a 20 20 20 20 69 66 20 28 69  5]) );.    if (i
26a30 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  dx+sz > pPage->p
26a40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20  Bt->usableSize) 
26a50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
26a60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26a70 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  PT;.    }.    pP
26a80 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
26a90 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
26aa0 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  = 2;.    memcpy(
26ab0 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d  &data[idx+nSkip]
26ac0 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
26ad0 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f  z-nSkip);.    fo
26ae0 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26  r(j=end-2, ptr=&
26af0 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20  data[j]; j>ins; 
26b00 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20  j-=2, ptr-=2){. 
26b10 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74       ptr[0] = pt
26b20 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72  r[-2];.      ptr
26b30 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20  [1] = ptr[-1];. 
26b40 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74     }.    put2byt
26b50 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64  e(&data[ins], id
26b60 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  x);.    put2byte
26b70 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
26b80 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69  Page->nCell);.#i
26b90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26ba0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
26bb0 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
26bc0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
26bd0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
26be0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
26bf0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
26c00 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
26c10 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
26c20 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
26c30 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
26c40 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
26c50 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
26c60 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  .      CellInfo 
26c70 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69  info;.      sqli
26c80 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
26c90 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
26ca0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
26cb0 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e   assert( (info.n
26cc0 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
26cd0 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
26ce0 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  )==info.nPayload
26cf0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
26d00 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
26d10 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
26d20 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63  nKey))>info.nLoc
26d30 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  al ){.        Pg
26d40 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65  no pgnoOvfl = ge
26d50 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
26d60 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
26d70 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
26d80 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
26d90 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  t, pgnoOvfl, PTR
26da0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
26db0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
26dc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26dd0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
26de0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
26df0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
26e00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26e10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
26e20 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
26e30 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
26e40 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
26e50 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
26e60 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
26e70 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
26e80 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
26e90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
26ea0 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
26eb0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
26ec0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
26ed0 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
26ee0 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
26ef0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
26f00 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
26f10 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
26f20 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
26f30 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
26f40 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
26f50 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65   */.  u16 *aSize
26f60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
26f70 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
26f80 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
26f90 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
26fa0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
26fb0 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f   totalSize;    /
26fc0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
26fd0 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69  all cells */.  i
26fe0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
26ff0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67   /* Index of pag
27000 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
27010 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20  t cellptr;      
27020 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
27030 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
27040 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
27050 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
27060 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
27070 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ody */.  u8 *dat
27080 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  a;         /* Da
27090 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ta for the page 
270a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
270b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
270c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
270d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
270e0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
270f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
27100 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43  ( nCell>=0 && nC
27110 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
27120 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
27130 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
27140 3d 35 34 36 30 20 29 3b 0a 20 20 74 6f 74 61 6c  =5460 );.  total
27150 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Size = 0;.  for(
27160 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
27170 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a  +){.    totalSiz
27180 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  e += aSize[i];. 
27190 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74   }.  assert( tot
271a0 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d  alSize+2*nCell<=
271b0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a  pPage->nFree );.
271c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
271d0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
271e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
271f0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
27200 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
27210 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50  ;.  cellptr = pP
27220 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
27230 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
27240 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
27250 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
27260 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
27270 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
27280 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29  );.  if( nCell )
27290 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d  {.    cellbody =
272a0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
272b0 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29  Page, totalSize)
272c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  ;.    assert( ce
272d0 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20  llbody>0 );.    
272e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
272f0 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20  Free >= 2*nCell 
27300 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
27310 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a  ree -= 2*nCell;.
27320 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
27330 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
27340 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
27350 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62  [cellptr], cellb
27360 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ody);.      memc
27370 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
27380 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
27390 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Size[i]);.      
273a0 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  cellptr += 2;.  
273b0 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20      cellbody += 
273c0 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a  aSize[i];.    }.
273d0 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
273e0 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74  body==pPage->pBt
273f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
27400 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
27410 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b  ll = (u16)nCell;
27420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
27430 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
27440 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
27450 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
27460 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
27470 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
27480 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
27490 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
274a0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
274b0 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
274c0 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
274d0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
274e0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
274f0 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
27500 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
27510 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
27520 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
27530 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
27540 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
27550 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
27560 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
27570 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
27580 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
27590 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
275a0 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
275b0 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
275c0 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
275d0 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
275e0 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
275f0 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
27600 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
27610 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
27620 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
27630 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
27640 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
27650 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
27660 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
27670 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
27680 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
27690 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
276a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
276b0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
276c0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
276d0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
276e0 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
276f0 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
27700 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
27710 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  nce */../* Forwa
27720 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
27730 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
27740 63 65 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e  ce(BtCursor*, in
27750 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
27760 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
27770 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LANCE./*.** This
27780 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61   version of bala
27790 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68  nce() handles th
277a0 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c  e common special
277b0 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61   case where.** a
277c0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65   new entry is be
277d0 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20  ing inserted on 
277e0 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
277f0 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  t-end of the.** 
27800 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  tree, in other w
27810 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e  ords, when the n
27820 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ew entry will be
27830 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74  come the largest
27840 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65  .** entry in the
27850 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73   tree..**.** Ins
27860 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62  tead of trying b
27870 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
27880 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
27890 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
278a0 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
278b0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
278c0 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
278d0 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
278e0 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
278f0 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
27900 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
27910 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
27920 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
27930 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
27940 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
27950 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
27960 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
27970 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
27980 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
27990 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
279a0 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
279b0 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
279c0 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
279d0 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
279e0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
279f0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
27a00 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
27a10 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
27a20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
27a30 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
27a40 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
27a50 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
27a60 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
27a70 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
27a80 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
27a90 5f 71 75 69 63 6b 28 42 74 43 75 72 73 6f 72 20  _quick(BtCursor 
27aa0 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
27ab0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
27ac0 77 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 70 67  w = 0;.  Pgno pg
27ad0 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65  noNew;.  u8 *pCe
27ae0 6c 6c 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c  ll;.  u16 szCell
27af0 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
27b00 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  o;.  MemPage *pP
27b10 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27b20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
27b30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
27b40 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  ent = pCur->apPa
27b50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
27b60 5d 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ];.  BtShared *p
27b70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
27b80 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78  .  int parentIdx
27b90 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
27ba0 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20  l;   /* pParent 
27bb0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
27bc0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
27bd0 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20  parentSize;     
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27bf0 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76   Size of new div
27c00 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75  ider cell */.  u
27c10 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d  8 parentCell[64]
27c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27c30 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68   /* Space for th
27c40 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
27c50 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
27c60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27c70 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
27c80 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
27c90 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
27ca0 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20  age. Insert the 
27cb0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
27cc0 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e  om pPage.  ** in
27cd0 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f  to it. Then remo
27ce0 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ve the overflow 
27cf0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
27d00 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
27d10 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
27d20 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
27d30 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
27d40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27d50 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  ){.    pCell = p
27d60 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  Page->aOvfl[0].p
27d70 43 65 6c 6c 3b 0a 20 20 20 20 73 7a 43 65 6c 6c  Cell;.    szCell
27d80 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
27d90 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
27da0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27db0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
27dc0 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
27dd0 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
27de0 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44  (pNew, pPage->aD
27df0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73  ata[0]);.    ass
27e00 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
27e10 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
27e20 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
27e30 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
27e40 20 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 20 69   .    /* pPage i
27e50 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20  s currently the 
27e60 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
27e70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74  Parent. Change t
27e80 68 69 73 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68  his.    ** so th
27e90 61 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  at the right-chi
27ea0 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61  ld is the new pa
27eb0 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  ge allocated abo
27ec0 76 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70 50  ve and.    ** pP
27ed0 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d  age is the next-
27ee0 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20  to-right child. 
27ef0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
27f00 67 6e 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e  gnore the return
27f10 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 61   value of the ca
27f20 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c  ll to fillInCell
27f30 28 29 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  (). fillInCell()
27f40 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79  .    ** may only
27f50 20 72 65 74 75 72 6e 20 6f 74 68 65 72 20 74 68   return other th
27f60 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
27f70 69 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74  it is required t
27f80 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a  o allocate.    *
27f90 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  * one or more ov
27fa0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 53 69  erflow pages. Si
27fb0 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  nce an internal 
27fc0 74 61 62 6c 65 20 42 2d 54 72 65 65 20 63 65 6c  table B-Tree cel
27fd0 6c 20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 65  l .    ** may ne
27fe0 76 65 72 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f  ver spill over o
27ff0 6e 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nto an overflow 
28000 70 61 67 65 20 28 69 74 20 69 73 20 61 20 6d 61  page (it is a ma
28010 78 69 6d 75 6d 20 6f 66 20 0a 20 20 20 20 2a 2a  ximum of .    **
28020 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
28030 65 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  e), it is not ne
28040 63 63 65 73 73 61 72 79 20 74 6f 20 63 68 65 63  ccessary to chec
28050 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
28060 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
28070 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
28080 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 66 75 6e  insertCell() fun
28090 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
280a0 6c 20 69 66 20 74 68 65 20 70 61 67 65 0a 20 20  l if the page.  
280b0 20 20 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65 72    ** being inser
280c0 74 65 64 20 69 6e 74 6f 20 69 73 20 61 6c 72 65  ted into is alre
280d0 61 64 79 20 77 72 69 74 61 62 6c 65 20 61 6e 64  ady writable and
280e0 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
280f0 6f 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ot .    ** conta
28100 69 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  in an overflow p
28110 6f 69 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72  ointer. So ignor
28120 65 20 74 68 69 73 20 72 65 74 75 72 6e 20 63 6f  e this return co
28130 64 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  de too..    */. 
28140 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28150 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
28160 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
28170 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
28180 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 73 71  nCell-1);.    sq
28190 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
281a0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
281b0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
281c0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
281d0 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  ent, parentCell,
281e0 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
281f0 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53  , 0, 0, &parentS
28200 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ize);.    assert
28210 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20  ( parentSize<64 
28220 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
28230 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
28240 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
28250 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
28260 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
28270 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70  nt, parentIdx, p
28280 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e  arentCell, paren
28290 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20  tSize, 0, 4);.  
282a0 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
282b0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
282c0 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20  ent,parentIdx), 
282d0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
282e0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
282f0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
28300 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
28310 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20  , pgnoNew);.  . 
28320 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
28330 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
28340 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
28350 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
28360 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  .    ** with ent
28370 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
28380 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
28390 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
283a0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
283b0 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
283c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
283d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
283e0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
283f0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
28400 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
28410 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
28420 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
28430 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28450 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
28460 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20  vfl(pNew, 0);.  
28470 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
28480 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
28490 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
284a0 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
284b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
284c0 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ew);.  }..  /* A
284d0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
284e0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 76 61   pPage->nFree va
284f0 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65  riable is not se
28500 74 20 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68  t correctly with
28510 0a 20 20 2a 2a 20 72 65 73 70 65 63 74 20 74 6f  .  ** respect to
28520 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28530 74 68 65 20 70 61 67 65 20 28 62 65 63 61 75 73  the page (becaus
28540 65 20 69 74 20 77 61 73 20 73 65 74 20 74 6f 20  e it was set to 
28550 30 20 62 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72  0 by .  ** inser
28560 74 43 65 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20  tCell). So call 
28570 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
28580 50 61 67 65 28 29 20 74 6f 20 6d 61 6b 65 20 73  Page() to make s
28590 75 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 63  ure it is.  ** c
285a0 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a  orrect..  **.  *
285b0 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65  * This has to be
285c0 20 64 6f 6e 65 20 65 76 65 6e 20 69 66 20 61 6e   done even if an
285d0 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
285e0 65 74 75 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c  eturned. Normall
285f0 79 2c 20 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72  y, if.  ** an er
28600 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
28610 67 20 74 72 65 65 20 62 61 6c 61 6e 63 69 6e 67  g tree balancing
28620 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
28630 66 20 4d 65 6d 50 61 67 65 20 61 72 65 0a 20 20  f MemPage are.  
28640 2a 2a 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  ** not important
28650 2c 20 61 73 20 74 68 65 79 20 77 69 6c 6c 20 62  , as they will b
28660 65 20 72 65 63 61 6c 63 75 6c 61 74 65 64 20 77  e recalculated w
28670 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
28680 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
28690 2e 20 42 75 74 20 68 65 72 65 2c 20 69 6e 20 62  . But here, in b
286a0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20  alance_quick(), 
286b0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
286c0 68 61 74 20 70 50 61 67 65 20 68 61 73 20 0a 20  hat pPage has . 
286d0 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e   ** not yet been
286e0 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 6f 72   marked dirty or
286f0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
28700 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
28710 54 68 65 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69  Therefore.  ** i
28720 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f  t will not be ro
28730 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 73 6f  lled back and so
28740 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
28750 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
28760 61 74 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  at.  ** the page
28770 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e   data and conten
28780 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72  ts of MemPage ar
28790 65 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20  e consistent..  
287a0 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  */.  pPage->isIn
287b0 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
287c0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
287d0 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
287e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
287f0 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  w==0 );..  /* If
28800 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
28810 20 73 75 63 63 65 65 64 65 64 2c 20 62 61 6c 61   succeeded, bala
28820 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
28830 61 67 65 2c 20 69 6e 20 0a 20 20 2a 2a 20 63 61  age, in .  ** ca
28840 73 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63  se the divider c
28850 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75  ell inserted cau
28860 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65  sed it to become
28870 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a   overfull..  */.
28880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28890 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  _OK ){.    relea
288a0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
288b0 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d     pCur->iPage--
288c0 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  ;.    rc = balan
288d0 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d  ce(pCur, 0);.  }
288e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
288f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
28900 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
28910 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  CE */../*.** Thi
28920 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
28930 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e  ributes Cells on
28940 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
28950 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a   NN*2 siblings.*
28960 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68  * of pPage so th
28970 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
28980 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65  e about the same
28990 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
289a0 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c  space..** Usuall
289b0 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  y NN siblings on
289c0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
289d0 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e  pPage is used in
289e0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a   the balancing,.
289f0 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73  ** though more s
28a00 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f  iblings might co
28a10 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  me from one side
28a20 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
28a30 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73   first.** or las
28a40 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
28a50 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65  arent.  If pPage
28a60 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
28a70 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  2*NN siblings.**
28a80 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
28a90 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
28aa0 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  n if pPage is th
28ab0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  e root page or a
28ac0 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f   .** child of ro
28ad0 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ot) then all ava
28ae0 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20  ilable siblings 
28af0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
28b00 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
28b10 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
28b20 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  f siblings of pP
28b30 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  age might be inc
28b40 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61  reased or decrea
28b50 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a  sed by one or.**
28b60 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
28b70 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
28b80 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
28b90 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54  not over full. T
28ba0 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  he root page.** 
28bb0 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69  is special and i
28bc0 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  s allowed to be 
28bd0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66  nearly empty. If
28be0 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68   pPage is .** th
28bf0 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  e root page, the
28c00 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  n the depth of t
28c10 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65  he tree might be
28c20 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72   increased.** or
28c30 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e   decreased by on
28c40 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c  e, as necessary,
28c50 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f   to keep the roo
28c60 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e  t page from bein
28c70 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72  g.** overfull or
28c80 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
28c90 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
28ca0 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  at when this rou
28cb0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
28cc0 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  some of the Cell
28cd0 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69  s on pPage.** mi
28ce0 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
28cf0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
28d00 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54  age->aData[].  T
28d10 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
28d20 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
28d30 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74   overfull.  Part
28d40 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74   of the job of t
28d50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
28d60 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61  o.** make sure a
28d70 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61  ll Cells for pPa
28d80 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69  ge once again fi
28d90 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  t in pPage->aDat
28da0 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  a[]..**.** In th
28db0 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61  e course of bala
28dc0 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e  ncing the siblin
28dd0 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  gs of pPage, the
28de0 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65   parent of pPage
28df0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  .** might become
28e00 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
28e10 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74  erfull.  If that
28e20 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74   happens, then t
28e30 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
28e40 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
28e50 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65  vely on the pare
28e60 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
28e70 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
28e80 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
28e90 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74  it might leave t
28ea0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
28eb0 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74  n a corrupted st
28ec0 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  ate.  So if this
28ed0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20   routine fails, 
28ee0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
28ef0 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64  uld.** be rolled
28f00 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
28f10 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e   int balance_non
28f20 72 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  root(BtCursor *p
28f30 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
28f40 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
28f50 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 76 65 72       /* The over
28f60 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20 70 61   or underfull pa
28f70 67 65 20 74 6f 20 62 61 6c 61 6e 63 65 20 2a 2f  ge to balance */
28f80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
28f90 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
28fa0 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66  /* The parent of
28fb0 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68   pPage */.  BtSh
28fc0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
28fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28fe0 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
28ff0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
29000 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
29010 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
29020 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
29030 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
29040 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
29050 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
29060 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
29070 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
29080 0a 20 20 69 6e 74 20 6e 4f 6c 64 20 3d 20 30 3b  .  int nOld = 0;
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
290b0 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
290c0 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
290d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
290f0 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
29100 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20  .  int nDiv;    
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
29130 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f  ls in apDiv[] */
29140 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
29170 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20   */.  int idx;  
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70     /* Index of p
291a0 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d  Page in pParent-
291b0 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
291c0 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
291d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
291e0 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
291f0 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
29200 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  l[] */.  int rc;
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
29230 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
29240 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t leafCorrection
29250 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
29260 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
29270 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
29280 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292a0 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
292b0 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
292c0 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
292d0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
292e0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
292f0 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
29300 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
29310 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
29320 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
29330 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
29340 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
29350 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
29360 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
29370 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
29380 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
29390 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
293a0 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
293b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
293c0 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
293d0 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
293e0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  ] */.  int iSpac
293f0 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e2 = 0;         
29400 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
29410 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
29420 63 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ce2[] */.  int s
29430 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
29440 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
29450 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
29460 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
29470 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
29480 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
29490 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
294a0 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
294b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b  .  Pgno pgnoOld[
294c0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
294d0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20  /* Page numbers 
294e0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
294f0 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65   apOld[] */.  Me
29500 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
29510 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
29520 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
29530 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
29540 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
29550 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
29560 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
29570 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
29580 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
29590 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
295a0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
295b0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
295c0 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
295d0 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75  n apNew[] */.  u
295e0 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20  8 *apDiv[NB];   
295f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
29600 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20  ivider cells in 
29610 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  pParent */.  int
29620 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   cntNew[NB+2];  
29630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29640 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66  ex in aCell[] of
29650 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68   cell after i-th
29660 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73   page */.  int s
29670 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  zNew[NB+2];     
29680 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69          /* Combi
29690 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  ned size of cell
296a0 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20  s place on i-th 
296b0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
296c0 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  pCell = 0;      
296d0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
296e0 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
296f0 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
29700 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
29710 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
29720 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
29730 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
29740 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20   u8 *aCopy[NB]; 
29750 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
29760 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74   for holding dat
29770 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f  a of apCopy[] */
29780 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20  .  u8 *aSpace1; 
29790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
297a0 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66  ce for copies of
297b0 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
297c0 62 65 66 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a  before balance *
297d0 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 32 20  /.  u8 *aSpace2 
297e0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 70  = 0;       /* Sp
297f0 61 63 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77  ace for overflow
29800 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
29810 61 66 74 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f  after balance */
29820 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30  .  u8 *aFrom = 0
29830 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
29840 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29850 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
29860 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
29870 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
29880 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 56 56 41  >mutex) );.  VVA
29890 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67  _ONLY( pCur->pag
298a0 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29  esShuffled = 1 )
298b0 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69  ;..  /* .  ** Fi
298c0 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nd the parent pa
298d0 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
298e0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
298f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29900 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
29910 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29920 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
29930 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
29940 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   || pPage->nOver
29950 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74  flow==1 );.  pBt
29960 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
29970 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d   pParent = pCur-
29980 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29990 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  age-1];.  assert
299a0 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69  ( pParent );.  i
299b0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
299c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
299d0 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70  Write(pParent->p
299e0 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20  DbPage)) ){.    
299f0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
29a00 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 54 52 41  anup;.  }..  TRA
29a10 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
29a20 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
29a30 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
29a40 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
29a50 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64  ->pgno));..#ifnd
29a60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
29a70 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a  UICKBALANCE.  /*
29a80 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20  .  ** A special 
29a90 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20  case:  If a new 
29aa0 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20 62  entry has just b
29ab0 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
29ac0 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28  o a.  ** table (
29ad0 74 68 61 74 20 69 73 2c 20 61 20 62 74 72 65 65  that is, a btree
29ae0 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65   with integer ke
29af0 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20  ys and all data 
29b00 61 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20  at the leaves). 
29b10 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20   ** and the new 
29b20 65 6e 74 72 79 20 69 73 20 74 68 65 20 72 69 67  entry is the rig
29b30 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e  ht-most entry in
29b40 20 74 68 65 20 74 72 65 65 20 28 69 74 20 68 61   the tree (it ha
29b50 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65  s the.  ** large
29b60 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65  st key) then use
29b70 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c   the special bal
29b80 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75  ance_quick() rou
29b90 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61  tine for.  ** ba
29ba0 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63  lancing.  balanc
29bb0 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63  e_quick() is muc
29bc0 68 20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73  h faster and res
29bd0 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74 65  ults in a tighte
29be0 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f  r.  ** packing o
29bf0 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f  f data in the co
29c00 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a  mmon case..  */.
29c10 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
29c20 66 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  f &&.      pPage
29c30 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20  ->intKey &&.    
29c40 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
29c50 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70  ow==1 &&.      p
29c60 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  Page->aOvfl[0].i
29c70 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx==pPage->nCell
29c80 20 26 26 0a 20 20 20 20 20 20 70 50 61 72 65 6e   &&.      pParen
29c90 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20  t->pgno!=1 &&.  
29ca0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
29cb0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
29cc0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
29cd0 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  8])==pPage->pgno
29ce0 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
29cf0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
29d00 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  );.    /*.    **
29d10 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65   TODO: Check the
29d20 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65   siblings to the
29d30 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20   left of pPage. 
29d40 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20  It may be that. 
29d50 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e     ** they are n
29d60 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e  ot full and no n
29d70 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75 69  ew page is requi
29d80 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
29d90 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71  return balance_q
29da0 75 69 63 6b 28 70 43 75 72 29 3b 0a 20 20 7d 0a  uick(pCur);.  }.
29db0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51  #endif..  if( SQ
29dc0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
29dd0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29de0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
29df0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 61  ) ){.    goto ba
29e00 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
29e10 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
29e20 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74  nd the cell in t
29e30 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
29e40 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20  hose left child 
29e50 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a  points back.  **
29e60 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20   to pPage.  The 
29e70 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69  "idx" variable i
29e80 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
29e90 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50  hat cell.  If pP
29ea0 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  age.  ** is the 
29eb0 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20  rightmost child 
29ec0 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20  of pParent then 
29ed0 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65  set idx to pPare
29ee0 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a  nt->nCell .  */.
29ef0 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69    idx = pCur->ai
29f00 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
29f10 31 5d 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65  1];.  assertPare
29f20 6e 74 49 6e 64 65 78 28 70 50 61 72 65 6e 74 2c  ntIndex(pParent,
29f30 20 69 64 78 2c 20 70 50 61 67 65 2d 3e 70 67 6e   idx, pPage->pgn
29f40 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  o);..  /*.  ** F
29f50 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ind sibling page
29f60 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74  s to pPage and t
29f70 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  he cells in pPar
29f80 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a  ent that divide.
29f90 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
29fa0 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69  s.  An attempt i
29fb0 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e  s made to find N
29fc0 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69  N siblings on ei
29fd0 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f  ther.  ** side o
29fe0 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73  f pPage.  More s
29ff0 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65  iblings are take
2a000 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c  n from one side,
2a010 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a   however, if.  *
2a020 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72  * pPage there ar
2a030 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
2a040 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
2a050 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20  other side.  If 
2a060 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
2a070 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
2a080 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
2a090 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
2a0a0 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20  nt are taken..  
2a0b0 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78  */.  nxDiv = idx
2a0c0 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44   - NN;.  if( nxD
2a0d0 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e  iv + NB > pParen
2a0e0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2a0f0 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d  nxDiv = pParent-
2a100 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b  >nCell - NB + 1;
2a110 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76  .  }.  if( nxDiv
2a120 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <0 ){.    nxDiv 
2a130 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20  = 0;.  }.  nDiv 
2a140 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 0;.  for(i=0, 
2a150 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69  k=nxDiv; i<NB; i
2a160 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, k++){.    if
2a170 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  ( k<pParent->nCe
2a180 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69  ll ){.      apDi
2a190 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
2a1a0 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20  pParent, k);.   
2a1b0 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20     nDiv++;.     
2a1c0 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e   assert( !pParen
2a1d0 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20  t->leaf );.     
2a1e0 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
2a1f0 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
2a200 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2a210 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  k==pParent->nCel
2a220 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f  l ){.      pgnoO
2a230 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65  ld[i] = get4byte
2a240 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2a250 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2a260 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
2a270 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
2a280 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2a290 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2a2a0 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20  Bt, pgnoOld[i], 
2a2b0 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  &apOld[i]);.    
2a2c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2a2d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2a2e0 20 20 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d 3e     /* apOld[i]->
2a2f0 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20 2a  idxParent = k; *
2a300 2f 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20  /.    apCopy[i] 
2a310 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
2a320 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20   i==nOld );.    
2a330 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78  nOld++;.    nMax
2a340 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64  Cells += 1+apOld
2a350 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64  [i]->nCell+apOld
2a360 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  [i]->nOverflow;.
2a370 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e    }..  /* Make n
2a380 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69  MaxCells a multi
2a390 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65  ple of 4 in orde
2a3a0 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d  r to preserve 8-
2a3b0 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d  byte.  ** alignm
2a3c0 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c  ent */.  nMaxCel
2a3d0 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20  ls = (nMaxCells 
2a3e0 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20  + 3)&~3;..  /*. 
2a3f0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   ** Allocate spa
2a400 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74  ce for memory st
2a410 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20  ructures.  */.  
2a420 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
2a430 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
2a440 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a460 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
2a470 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
2a480 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
2a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a4a0 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
2a4b0 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a 65 6f   + (ROUND8(sizeo
2a4c0 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42 74 2d  f(MemPage))+pBt-
2a4d0 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20 20 2f  >pageSize)*NB  /
2a4e0 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20  * aCopy */.     
2a4f0 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  + pBt->pageSize 
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a520 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20   aSpace1 */.    
2a530 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d   + (ISAUTOVACUUM
2a540 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30   ? nMaxCells : 0
2a550 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
2a560 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70 43  * aFrom */.  apC
2a570 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
2a580 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
2a590 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
2a5a0 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
2a5b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2a5c0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
2a5d0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2a5e0 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
2a5f0 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
2a600 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30  ells];.  aCopy[0
2a610 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c  ] = (u8*)&szCell
2a620 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
2a630 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30  ssert( ((aCopy[0
2a640 5d 20 2d 20 28 75 38 2a 29 30 29 20 26 20 37 29  ] - (u8*)0) & 7)
2a650 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
2a660 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
2a670 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31  red */.  for(i=1
2a680 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<NB; i++){.  
2a690 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43    aCopy[i] = &aC
2a6a0 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61  opy[i-1][pBt->pa
2a6b0 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69  geSize+ROUND8(si
2a6c0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b  zeof(MemPage))];
2a6d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61  .    assert( ((a
2a6e0 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 30  Copy[i] - (u8*)0
2a6f0 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
2a700 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
2a710 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d   required */.  }
2a720 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61 43  .  aSpace1 = &aC
2a730 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70  opy[NB-1][pBt->p
2a740 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
2a750 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
2a760 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 53  ;.  assert( ((aS
2a770 70 61 63 65 31 20 2d 20 28 75 38 2a 29 30 29 20  pace1 - (u8*)0) 
2a780 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
2a790 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
2a7a0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28  equired */.  if(
2a7b0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2a7c0 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53  .    aFrom = &aS
2a7d0 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
2a7e0 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70 61  ize];.  }.  aSpa
2a7f0 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ce2 = sqlite3Pag
2a800 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67  eMalloc(pBt->pag
2a810 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53  eSize);.  if( aS
2a820 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20  pace2==0 ){.    
2a830 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2a840 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
2a850 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
2a860 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61  .  .  /*.  ** Ma
2a870 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
2a880 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67   content of pPag
2a890 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
2a8a0 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a  gs into aOld[]..
2a8b0 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
2a8c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2a8d0 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
2a8e0 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
2a8f0 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  her.  ** that th
2a900 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
2a910 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
2a920 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
2a930 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72  e in the.  ** pr
2a940 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
2a950 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  verwritten..  */
2a960 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
2a970 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
2a980 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70  mPage *p = apCop
2a990 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
2a9a0 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d  )aCopy[i];.    m
2a9b0 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69  emcpy(p, apOld[i
2a9c0 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ], sizeof(MemPag
2a9d0 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  e));.    p->aDat
2a9e0 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d  a = (void*)&p[1]
2a9f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
2aa00 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
2aa10 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
2aa20 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
2aa30 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
2aa40 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
2aa50 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
2aa60 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
2aa70 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
2aa80 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
2aa90 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
2aaa0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
2aab0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
2aac0 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
2aad0 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70  btained form aSp
2aae0 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
2aaf0 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
2ab00 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
2ab10 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
2ab20 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
2ab30 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
2ab40 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
2ab50 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
2ab60 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
2ab70 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
2ab80 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
2ab90 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
2aba0 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
2abb0 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d  * into aSpace1[]
2abc0 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
2abd0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
2abe0 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
2abf0 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
2ac00 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
2ac10 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
2ac20 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
2ac30 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
2ac40 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
2ac50 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
2ac60 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
2ac70 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
2ac80 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
2ac90 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
2aca0 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
2acb0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
2acc0 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
2acd0 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
2ace0 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
2acf0 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
2ad00 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
2ad10 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
2ad20 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43   keys..  */.  nC
2ad30 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43  ell = 0;.  leafC
2ad40 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67  orrection = pPag
2ad50 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  e->leaf*4;.  lea
2ad60 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 68  fData = pPage->h
2ad70 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
2ad80 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
2ad90 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
2ada0 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a  ld = apCopy[i];.
2adb0 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
2adc0 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
2add0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
2ade0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
2adf0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t; j++){.      a
2ae00 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
2ae10 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
2ae20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
2ae30 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2ae40 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
2ae50 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2ae60 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
2ae70 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
2ae80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  );.      if( ISA
2ae90 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2aea0 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20       int a;.    
2aeb0 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
2aec0 20 3d 20 28 75 38 29 69 3b 20 20 20 61 73 73 65   = (u8)i;   asse
2aed0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 36 20  rt( i>=0 && i<6 
2aee0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61  );.        for(a
2aef0 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65  =0; a<pOld->nOve
2af00 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20  rflow; a++){.   
2af10 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
2af20 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d  >aOvfl[a].pCell=
2af30 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29  =apCell[nCell] )
2af40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 46  {.            aF
2af50 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
2af60 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  F;.            b
2af70 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2af80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2af90 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b    }.      nCell+
2afa0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
2afb0 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20   i<nOld-1 ){.   
2afc0 20 20 20 75 31 36 20 73 7a 20 3d 20 63 65 6c 6c     u16 sz = cell
2afd0 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
2afe0 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
2aff0 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
2b000 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74  {.        /* Wit
2b010 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20 66  h the LEAFDATA f
2b020 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c  lag, pParent cel
2b030 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54  ls hold only INT
2b040 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20 20  KEYs that.      
2b050 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61    ** are duplica
2b060 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74  tes of keys on t
2b070 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20  he child pages. 
2b080 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f   We need to remo
2b090 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ve.        ** th
2b0a0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
2b0b0 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75  from pParent, bu
2b0c0 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20 63  t the dividers c
2b0d0 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20  ells are not.   
2b0e0 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
2b0f0 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73   apCell[] becaus
2b100 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c 69  e they are dupli
2b110 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63  cates of child c
2b120 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ells..        */
2b130 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
2b140 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2b150 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , sz);.      }el
2b160 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  se{.        u8 *
2b170 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  pTemp;.        a
2b180 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
2b190 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
2b1a0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
2b1b0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54  = sz;.        pT
2b1c0 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69  emp = &aSpace1[i
2b1d0 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 20  Space1];.       
2b1e0 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
2b1f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b200 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
2b210 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 20 20 61  e/4 );.        a
2b220 73 73 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d  ssert( iSpace1<=
2b230 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
2b240 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2b250 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c  pTemp, apDiv[i],
2b260 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70   sz);.        ap
2b270 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
2b280 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
2b290 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
2b2a0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2b2b0 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b            aFrom[
2b2c0 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20  nCell] = 0xFF;. 
2b2d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b2e0 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
2b2f0 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
2b300 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2b310 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
2b320 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69   || leafCorrecti
2b330 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
2b340 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
2b350 3d 20 28 75 31 36 29 6c 65 61 66 43 6f 72 72 65  = (u16)leafCorre
2b360 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61  ction;.        a
2b370 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
2b380 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b  pTemp)==pgnoOld[
2b390 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  i] );.        if
2b3a0 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b  ( !pOld->leaf ){
2b3b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b3c0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
2b3d0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2b3e0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
2b3f0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
2b400 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
2b410 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
2b420 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2b430 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64  ter of the divid
2b440 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20  er cell */.     
2b450 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
2b460 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
2b470 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64  ->aData[pOld->hd
2b480 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a  rOffset+8], 4);.
2b490 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b4a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b4b0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2b4c0 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =4 );.          
2b4d0 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c  if( szCell[nCell
2b4e0 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ]<4 ){.         
2b4f0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
2b500 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61  ow any cells sma
2b510 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65  ller than 4 byte
2b520 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
2b530 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
2b540 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 4;.          }
2b550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b560 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
2b570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2b580 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
2b590 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
2b5a0 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
2b5b0 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
2b5c0 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
2b5d0 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
2b5e0 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
2b5f0 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
2b600 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
2b610 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
2b620 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
2b630 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
2b640 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
2b650 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
2b660 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
2b670 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
2b680 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
2b690 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
2b6a0 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
2b6b0 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
2b6c0 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
2b6d0 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
2b6e0 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
2b6f0 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
2b700 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
2b710 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
2b720 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
2b730 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
2b740 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
2b750 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
2b760 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
2b770 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
2b780 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
2b790 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
2b7a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2b7b0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
2b7c0 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
2b7d0 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
2b7e0 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
2b7f0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
2b800 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
2b810 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
2b820 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
2b830 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
2b840 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
2b850 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
2b860 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
2b870 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
2b880 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
2b890 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2b8a0 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
2b8b0 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
2b8c0 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
2b8d0 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
2b8e0 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
2b8f0 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
2b900 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
2b910 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
2b920 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
2b930 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
2b940 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
2b950 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  k++;.    }.  }. 
2b960 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
2b970 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
2b980 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
2b990 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
2b9a0 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
2b9b0 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
2b9c0 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
2b9d0 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
2b9e0 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
2b9f0 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
2ba00 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
2ba10 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
2ba20 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
2ba30 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
2ba40 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
2ba50 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
2ba60 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
2ba70 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
2ba80 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
2ba90 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
2baa0 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
2bab0 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
2bac0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
2bad0 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
2bae0 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
2baf0 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
2bb00 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
2bb10 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
2bb20 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
2bb30 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
2bb40 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
2bb50 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
2bb60 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
2bb70 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
2bb80 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
2bb90 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
2bba0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
2bbb0 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
2bbc0 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
2bbd0 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
2bbe0 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
2bbf0 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
2bc00 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
2bc10 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
2bc20 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
2bc30 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
2bc40 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
2bc50 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2bc60 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
2bc70 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
2bc80 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
2bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bca0 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
2bcb0 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
2bcc0 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
2bcd0 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
2bce0 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
2bcf0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
2bd00 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
2bd10 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
2bd20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
2bd30 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2bd40 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
2bd50 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73  ==0 || szRight+s
2bd60 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
2bd70 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
2bd80 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
2bd90 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
2bda0 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
2bdb0 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
2bdc0 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
2bdd0 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
2bde0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
2bdf0 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
2be00 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
2be10 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
2be20 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
2be30 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
2be40 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
2be50 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
2be60 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
2be70 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
2be80 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a 20   or we are the. 
2be90 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f   ** a virtual ro
2bea0 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74  ot page.  A virt
2beb0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
2bec0 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72   when the real r
2bed0 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73  oot.  ** page is
2bee0 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61   page 1 and we a
2bef0 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c  re the only chil
2bf00 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a  d of that page..
2bf10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63    */.  assert( c
2bf20 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70  ntNew[0]>0 || (p
2bf30 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20  Parent->pgno==1 
2bf40 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
2bf50 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20  l==0) );..  /*. 
2bf60 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
2bf70 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
2bf80 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
2bf90 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
2bfa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2bfb0 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67  >pgno>1 );.  pag
2bfc0 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e  eFlags = pPage->
2bfd0 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
2bfe0 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
2bff0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
2c000 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
2c010 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
2c020 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
2c030 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e  ld[i];.      pgn
2c040 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c  oNew[i] = pgnoOl
2c050 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
2c060 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
2c070 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c080 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
2c090 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65  Page);.      nNe
2c0a0 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72  w++;.      if( r
2c0b0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
2c0c0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
2c0d0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2c0e0 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
2c0f0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2c100 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
2c110 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20  w, &pgnoNew[i], 
2c120 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29  pgnoNew[i-1], 0)
2c130 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2c140 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2c150 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e  eanup;.      apN
2c160 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20  ew[i] = pNew;.  
2c170 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
2c180 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  }.  }..  /* Free
2c190 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
2c1a0 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
2c1b0 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
2c1c0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
2c1d0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63  i<nOld ){.    rc
2c1e0 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c   = freePage(apOl
2c1f0 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
2c200 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
2c210 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
2c220 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
2c230 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
2c240 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
2c250 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
2c260 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
2c270 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
2c280 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
2c290 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
2c2a0 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
2c2b0 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
2c2c0 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
2c2d0 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
2c2e0 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
2c2f0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
2c300 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
2c310 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
2c320 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2c330 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
2c340 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
2c350 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
2c360 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
2c370 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
2c380 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
2c390 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
2c3a0 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
2c3b0 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
2c3c0 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
2c3d0 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
2c3e0 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
2c3f0 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
2c400 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
2c410 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
2c420 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
2c430 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
2c440 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
2c450 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
2c460 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
2c470 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
2c480 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
2c490 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e    int minV = pgn
2c4a0 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  oNew[i];.    int
2c4b0 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
2c4c0 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
2c4d0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2c4e0 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67  gnoNew[j]<(unsig
2c4f0 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
2c500 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
2c510 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e        minV = pgn
2c520 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  oNew[j];.      }
2c530 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
2c540 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69  inI>i ){.      i
2c550 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50  nt t;.      MemP
2c560 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74  age *pT;.      t
2c570 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
2c580 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b       pT = apNew[
2c590 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
2c5a0 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d  w[i] = pgnoNew[m
2c5b0 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  inI];.      apNe
2c5c0 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
2c5d0 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  I];.      pgnoNe
2c5e0 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20  w[minI] = t;.   
2c5f0 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
2c600 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
2c610 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2c620 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
2c630 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28   new: %d(%d) %d(
2c640 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
2c650 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
2c660 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20   pgnoOld[0], .  
2c670 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f    nOld>=2 ? pgno
2c680 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  Old[1] : 0,.    
2c690 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c  nOld>=3 ? pgnoOl
2c6a0 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67  d[2] : 0,.    pg
2c6b0 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b  noNew[0], szNew[
2c6c0 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
2c6d0 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30  ? pgnoNew[1] : 0
2c6e0 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
2c6f0 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
2c700 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=3 ? pgnoNew[
2c710 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20  2] : 0, nNew>=3 
2c720 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a  ? szNew[2] : 0,.
2c730 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67      nNew>=4 ? pg
2c740 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e  noNew[3] : 0, nN
2c750 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d  ew>=4 ? szNew[3]
2c760 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
2c770 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a  5 ? pgnoNew[4] :
2c780 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
2c790 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
2c7a0 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
2c7b0 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
2c7c0 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
2c7d0 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
2c7e0 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
2c7f0 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
2c800 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
2c810 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
2c820 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
2c830 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
2c840 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
2c850 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
2c860 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
2c870 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
2c880 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
2c890 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
2c8a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2c8b0 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  pNew->pgno==pgno
2c8c0 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 7a 65  New[i] );.    ze
2c8d0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67  roPage(pNew, pag
2c8e0 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73  eFlags);.    ass
2c8f0 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
2c900 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70  cntNew[i]-j, &ap
2c910 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c  Cell[j], &szCell
2c920 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [j]);.    assert
2c930 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20  ( pNew->nCell>0 
2c940 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63  || (nNew==1 && c
2c950 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a  ntNew[0]==0) );.
2c960 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2c970 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2c980 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2c990 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2c9a0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
2c9b0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2c9c0 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20   map entries.   
2c9d0 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
2c9e0 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74  o the siblings t
2c9f0 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61 6e  hat were rearran
2ca00 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62  ged. These can b
2ca10 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63  e: left.    ** c
2ca20 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73  hildren of cells
2ca30 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  , the right-chil
2ca40 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f  d of the page, o
2ca50 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
2ca60 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20  .    ** pointed 
2ca70 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20  to by cells..   
2ca80 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2ca90 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2caa0 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74    for(k=j; k<cnt
2cab0 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20  New[i]; k++){.  
2cac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
2cad0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2cae0 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b       if( aFrom[k
2caf0 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70  ]==0xFF || apCop
2cb00 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e  y[aFrom[k]]->pgn
2cb10 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
2cb20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2cb30 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e  ptrmapPutOvfl(pN
2cb40 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20  ew, k-j);.      
2cb50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cb60 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 6f 72  TE_OK && leafCor
2cb70 72 65 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  rection==0 ){.  
2cb80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2cb90 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
2cba0 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 6b 5d  t4byte(apCell[k]
2cbb0 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
2cbc0 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20   pNew->pgno);.  
2cbd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cbe0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cbf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2cc00 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2cc10 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2cc20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2cc30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2cc40 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
2cc50 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
2cc60 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
2cc70 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
2cc80 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
2cc90 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
2cca0 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
2ccb0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
2ccc0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2ccd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2cce0 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e   i<nNew-1 && j<n
2ccf0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38  Cell ){.      u8
2cd00 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75   *pCell;.      u
2cd10 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
2cd20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61  int sz;..      a
2cd30 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
2cd40 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  ls );.      pCel
2cd50 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20  l = apCell[j];. 
2cd60 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c       sz = szCell
2cd70 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63  [j] + leafCorrec
2cd80 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  tion;.      pTem
2cd90 70 20 3d 20 26 61 53 70 61 63 65 32 5b 69 53 70  p = &aSpace2[iSp
2cda0 61 63 65 32 5d 3b 0a 20 20 20 20 20 20 69 66 28  ace2];.      if(
2cdb0 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a   !pNew->leaf ){.
2cdc0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2cdd0 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pNew->aData[8], 
2cde0 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20  pCell, 4);.     
2cdf0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2ce00 55 55 4d 20 0a 20 20 20 20 20 20 20 20 20 26 26  UUM .         &&
2ce10 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46   (aFrom[j]==0xFF
2ce20 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d   || apCopy[aFrom
2ce30 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  [j]]->pgno!=pNew
2ce40 2d 3e 70 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  ->pgno).        
2ce50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2ce60 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
2ce70 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
2ce80 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2ce90 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  pNew->pgno);.   
2cea0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2ceb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cec0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
2ced0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2cee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cef0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
2cf00 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
2cf10 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2cf20 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66  e tree is a leaf
2cf30 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20  -data tree, and 
2cf40 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
2cf50 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20   leaves, .      
2cf60 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
2cf70 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65  is no divider ce
2cf80 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20  ll in apCell[]. 
2cf90 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76  Instead, the div
2cfa0 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ider .        **
2cfb0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
2cfc0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
2cfd0 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  y for the right-
2cfe0 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20  most cell of .  
2cff0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62        ** the sib
2d000 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62  ling-page assemb
2d010 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a  led above only..
2d020 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d030 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
2d040 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20  ;.        j--;. 
2d050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
2d060 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2d070 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c  pNew, apCell[j],
2d080 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
2d090 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
2d0a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c          rc = fil
2d0b0 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
2d0c0 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e   pCell, 0, info.
2d0d0 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26  nKey, 0, 0, 0, &
2d0e0 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  sz);.        if(
2d0f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d100 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2d110 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2d120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d130 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20      pTemp = 0;. 
2d140 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d150 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a      pCell -= 4;.
2d160 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75          /* Obscu
2d170 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d  re case for non-
2d180 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a  leaf-data trees:
2d190 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20   If the cell at 
2d1a0 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20  pCell was.      
2d1b0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
2d1c0 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66  stored on a leaf
2d1d0 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72   node, and its r
2d1e0 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73  eported size was
2d1f0 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79   4.        ** by
2d200 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  tes, then it may
2d210 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61   actually be sma
2d220 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a  ller than this .
2d230 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20          ** (see 
2d240 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
2d250 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
2d260 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
2d270 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
2d280 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
2d290 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
2d2a0 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65  tant to pass the
2d2b0 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f   correct size to
2d2c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
2d2d0 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65  ertCell(), so re
2d2e0 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e  parse the cell n
2d2f0 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ow..        **. 
2d300 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
2d310 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76  hat this can nev
2d320 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20  er happen in an 
2d330 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65  SQLite data file
2d340 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20  , as all.       
2d350 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74   ** cells are at
2d360 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20   least 4 bytes. 
2d370 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  It only happens 
2d380 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a  in b-trees used.
2d390 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76          ** to ev
2d3a0 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45  aluate "IN (SELE
2d3b0 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d  CT ...)" and sim
2d3c0 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20  ilar clauses..  
2d3d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d3e0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d   if( szCell[j]==
2d3f0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  4 ){.          a
2d400 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63  ssert(leafCorrec
2d410 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20  tion==4);.      
2d420 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
2d430 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43  ePtr(pParent, pC
2d440 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ell);.        }.
2d450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53        }.      iS
2d460 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20  pace2 += sz;.   
2d470 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
2d480 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
2d490 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2d4a0 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61  iSpace2<=pBt->pa
2d4b0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
2d4c0 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
2d4d0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
2d4e0 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70  pCell, sz, pTemp
2d4f0 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 4);.      if( 
2d500 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2d510 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2d520 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65  anup;.      asse
2d530 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2d540 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
2d550 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
2d560 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2d570 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2d580 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c  (pParent,nxDiv),
2d590 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20   pNew->pgno);.. 
2d5a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
2d5b0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
2d5c0 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20  m database, and 
2d5d0 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20  not a leaf-data 
2d5e0 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  tree,.      ** t
2d5f0 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70  hen update the p
2d600 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20  ointer map with 
2d610 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
2d620 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
2d630 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65       ** that the
2d640 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72   cell just inser
2d650 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69  ted points to (i
2d660 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
2d670 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
2d680 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65 61 66  OVACUUM && !leaf
2d690 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
2d6a0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
2d6b0 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  fl(pParent, nxDi
2d6c0 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  v);.        if( 
2d6d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d6e0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2d6f0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2d700 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d710 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20   }.      j++;.  
2d720 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
2d730 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
2d740 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2d750 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  ntry for the new
2d760 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
2d770 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
2d780 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2d790 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
2d7a0 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  Bt, pNew->pgno, 
2d7b0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
2d7c0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
2d7d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d7e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d7f0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2d800 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20  eanup;.      }. 
2d810 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2d820 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
2d830 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
2d840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
2d850 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
2d860 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
2d870 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38  AF)==0 ){.    u8
2d880 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f   *zChild = &apCo
2d890 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74  py[nOld-1]->aDat
2d8a0 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  a[8];.    memcpy
2d8b0 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  (&apNew[nNew-1]-
2d8c0 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c  >aData[8], zChil
2d8d0 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 49  d, 4);.    if( I
2d8e0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2d8f0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2d900 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
2d910 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d 41  e(zChild), PTRMA
2d920 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 6e  P_BTREE, apNew[n
2d930 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20  New-1]->pgno);. 
2d940 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d960 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2d970 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a  leanup;.      }.
2d980 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
2d990 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2d9a0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
2d9b0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
2d9c0 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50  .  if( nxDiv==pP
2d9d0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61  arent->nCell+pPa
2d9e0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
2d9f0 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d  ){.    /* Right-
2da00 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20  most sibling is 
2da10 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
2da20 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20  hild of pParent 
2da30 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
2da40 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2da50 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2da60 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e  et+8], pgnoNew[n
2da70 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65  New-1]);.  }else
2da80 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d  {.    /* Right-m
2da90 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74  ost sibling is t
2daa0 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66  he left child of
2dab0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2dac0 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20   in pParent.    
2dad0 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69 67 68  ** past the righ
2dae0 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65  t-most divider e
2daf0 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34  ntry */.    put4
2db00 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
2db10 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  wCell(pParent, n
2db20 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e  xDiv), pgnoNew[n
2db30 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20  New-1]);.  }..  
2db40 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20  /*.  ** Balance 
2db50 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2db60 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
2db70 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50  current page (pP
2db80 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  age) might.  ** 
2db90 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20  have been added 
2dba0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
2dbb0 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c  so it might no l
2dbc0 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c  onger be initial
2dbd0 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74  ized..  ** But t
2dbe0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
2dbf0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e  ill always be in
2dc00 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
2dc10 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2dc20 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 73  t->isInit );.  s
2dc30 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
2dc40 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70 43  e(apCell);.  apC
2dc50 65 6c 6c 20 3d 20 30 3b 0a 20 20 54 52 41 43 45  ell = 0;.  TRACE
2dc60 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
2dc70 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c  shed with %d: ol
2dc80 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
2dc90 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
2dca0 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
2dcb0 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
2dcc0 6c 29 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  l));.  pPage->nO
2dcd0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 72  verflow = 0;.  r
2dce0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2dcf0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
2dd00 2d 2d 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e  --;.  rc = balan
2dd10 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 0a  ce(pCur, 0);.  .
2dd20 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
2dd30 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
2dd40 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
2dd50 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
2dd60 74 65 33 50 61 67 65 46 72 65 65 28 61 53 70 61  te3PageFree(aSpa
2dd70 63 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ce2);.  sqlite3S
2dd80 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c  cratchFree(apCel
2dd90 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l);.  for(i=0; i
2dda0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
2ddb0 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
2ddc0 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f  ld[i]);.  }.  fo
2ddd0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
2dde0 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
2ddf0 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  Page(apNew[i]);.
2de00 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 70 50 61    }.  pCur->apPa
2de10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2de20 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
2de30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2de40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2de50 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
2de60 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  r the root page 
2de70 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20  of a btree when 
2de80 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
2de90 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
2dea0 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ls.  This is an 
2deb0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d  opportunity to m
2dec0 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20  ake the tree.** 
2ded0 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65  shallower by one
2dee0 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
2def0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68  c int balance_sh
2df00 61 6c 6c 6f 77 65 72 28 42 74 43 75 72 73 6f 72  allower(BtCursor
2df10 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2df20 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
2df30 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
2df40 70 61 67 65 20 6f 66 20 42 2d 54 72 65 65 20 2a  page of B-Tree *
2df50 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
2df60 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
2df70 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69   /* The only chi
2df80 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65  ld page of pPage
2df90 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
2dfa0 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
2dfb0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2dfc0 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a  r for pChild */.
2dfd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2dfe0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
2dff0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
2e000 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
2e010 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
2e020 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
2e030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2e040 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72  n BTree structur
2e050 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c  e */.  int mxCel
2e060 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20  lPerPage;       
2e070 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
2e080 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70  umber of cells p
2e090 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  er page */.  u8 
2e0a0 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  **apCell;       
2e0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2e0c0 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65   cells from page
2e0d0 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
2e0e0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
2e0f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2e100 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
2e110 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
2e120 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
2e130 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ->iPage==0 );.  
2e140 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2e150 50 61 67 65 5b 30 5d 3b 0a 0a 20 20 61 73 73 65  Page[0];..  asse
2e160 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2e170 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2e180 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2e190 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2e1a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20  mutex) );.  pBt 
2e1b0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2e1c0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20  mxCellPerPage = 
2e1d0 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20  MX_CELL(pBt);.  
2e1e0 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
2e1f0 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65  Malloc( mxCellPe
2e200 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38  rPage*(sizeof(u8
2e210 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29 20  *)+sizeof(u16)) 
2e220 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  );.  if( apCell=
2e230 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2e240 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65  TE_NOMEM;.  szCe
2e250 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65  ll = (u16*)&apCe
2e260 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  ll[mxCellPerPage
2e270 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ];.  if( pPage->
2e280 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54  leaf ){.    /* T
2e290 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  he table is comp
2e2a0 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a  letely empty */.
2e2b0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2e2c0 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65  NCE: empty table
2e2d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2e2e0 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
2e2f0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
2e300 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75  page is empty bu
2e310 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e  t has one child.
2e320 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20    Transfer the. 
2e330 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
2e340 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20  n from that one 
2e350 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72  child into the r
2e360 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20 0a  oot page if it .
2e370 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e      ** will fit.
2e380 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74    This reduces t
2e390 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
2e3a0 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20  tree by one..   
2e3b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
2e3c0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70  e root page is p
2e3d0 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65  age 1, it has le
2e3e0 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ss space availab
2e3f0 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69  le than.    ** i
2e400 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f  ts child (due to
2e410 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65   the 100 byte he
2e420 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73  ader that occurs
2e430 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2e440 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  g.    ** of the 
2e450 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73  database fle), s
2e460 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62  o it might not b
2e470 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61  e able to hold a
2e480 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a  ll of the .    *
2e490 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75  * information cu
2e4a0 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65  rrently containe
2e4b0 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20  d in the child. 
2e4c0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2e4d0 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68  .    ** case, th
2e4e0 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  en do not do the
2e4f0 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76   transfer.  Leav
2e500 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65  e page 1 empty e
2e510 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
2e520 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
2e530 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  er to the child 
2e540 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64  page.  The child
2e550 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20   page becomes.  
2e560 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c    ** the virtual
2e570 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
2e580 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 56 56  e..    */.    VV
2e590 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61  A_ONLY( pCur->pa
2e5a0 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20  gesShuffled = 1 
2e5b0 29 3b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64  );.    pgnoChild
2e5c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2e5d0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2e5e0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2e5f0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2e600 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61  Child>0 );.    a
2e610 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
2e620 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  <=pagerPagecount
2e630 28 70 50 61 67 65 2d 3e 70 42 74 29 20 29 3b 0a  (pPage->pBt) );.
2e640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e650 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50 61  BtreeGetPage(pPa
2e660 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69  ge->pBt, pgnoChi
2e670 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b  ld, &pChild, 0);
2e680 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2e690 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
2e6a0 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20  alance;.    if( 
2e6b0 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pPage->pgno==1 )
2e6c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2e6d0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2e6e0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
2e6f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2e700 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
2e710 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ce;.      assert
2e720 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66  ( pChild->nOverf
2e730 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  low==0 );.      
2e740 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65  if( pChild->nFre
2e750 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20  e>=100 ){.      
2e760 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69    /* The child i
2e770 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20  nformation will 
2e780 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  fit on the root 
2e790 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a  page, so do the.
2e7a0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20          ** copy 
2e7b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2e7c0 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61  ;.        zeroPa
2e7d0 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
2e7e0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
2e7f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2e800 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69  pChild->nCell; i
2e810 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
2e820 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43  pCell[i] = findC
2e830 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20  ell(pChild,i);. 
2e840 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
2e850 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
2e860 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b  (pChild, apCell[
2e870 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
2e880 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50         assembleP
2e890 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
2e8a0 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c  d->nCell, apCell
2e8b0 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20  , szCell);.     
2e8c0 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72     /* Copy the r
2e8d0 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20  ight-pointer of 
2e8e0 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65  the child to the
2e8f0 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
2e900 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2e910 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e920 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2e930 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ge) );.        p
2e940 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
2e950 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2e960 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20  Offset+8], .    
2e970 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
2e980 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  (&pChild->aData[
2e990 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65  pChild->hdrOffse
2e9a0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  t+8]));.        
2e9b0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 43  rc = freePage(pC
2e9c0 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54  hild);.        T
2e9d0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2e9e0 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65  child %d transfe
2e9f0 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20  r to page 1\n", 
2ea00 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
2ea10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ea20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c       /* The chil
2ea30 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72  d has more infor
2ea40 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
2ea50 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
2ea60 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
2ea70 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79   tree is already
2ea80 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e   balanced.  Do n
2ea90 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  othing. */.     
2eaa0 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2eab0 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c  CE: child %d wil
2eac0 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67  l not fit on pag
2ead0 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e  e 1\n", pChild->
2eae0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a  pgno));.      }.
2eaf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2eb00 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61   memcpy(pPage->a
2eb10 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Data, pChild->aD
2eb20 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  ata, pPage->pBt-
2eb30 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
2eb40 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
2eb50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
2eb60 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2eb70 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
2eb80 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2eb90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2eba0 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68      freePage(pCh
2ebb0 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43  ild);.      TRAC
2ebc0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61  E(("BALANCE: tra
2ebd0 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64 20 69  nsfer child %d i
2ebe0 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a  nto root %d\n",.
2ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2ec00 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67  hild->pgno, pPag
2ec10 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  e->pgno));.    }
2ec20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ec30 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
2ec40 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
2ec50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2ec60 55 4d 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  UM.    if( ISAUT
2ec70 4f 56 41 43 55 55 4d 20 26 26 20 72 63 3d 3d 53  OVACUUM && rc==S
2ec80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ec90 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
2eca0 74 72 6d 61 70 73 28 70 50 61 67 65 29 3b 0a 20  trmaps(pPage);. 
2ecb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2ecc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
2ecd0 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61  ld);.  }.end_sha
2ece0 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20  llow_balance:.  
2ecf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43  sqlite3_free(apC
2ed00 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ell);.  return r
2ed10 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  c;.}.../*.** The
2ed20 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76   root page is ov
2ed30 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65  erfull.**.** Whe
2ed40 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  n this happens, 
2ed50 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  Create a new chi
2ed60 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79  ld page and copy
2ed70 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
2ed80 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74   of the root int
2ed90 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68  o the child.  Th
2eda0 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74  en make the root
2edb0 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74  .** page an empt
2edc0 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67 68  y page with righ
2edd0 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20  tChild pointing 
2ede0 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68  to the new.** ch
2edf0 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20  ild.   Finally, 
2ee00 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74  call balance_int
2ee10 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e  ernal() on the n
2ee20 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63  ew child.** to c
2ee30 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74  ause it to split
2ee40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ee50 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 42  balance_deeper(B
2ee60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2ee70 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2ee80 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ee90 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72  value from subpr
2eea0 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65  ocedures */.  Me
2eeb0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
2eec0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2eed0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f  the root page */
2eee0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
2eef0 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ld;    /* Pointe
2ef00 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  r to a new child
2ef10 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
2ef20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f  pgnoChild;     /
2ef30 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
2ef40 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
2ef50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
2ef60 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
2ef70 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a  /* The BTree */.
2ef80 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
2ef90 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75  ;     /* Total u
2efa0 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20  sable size of a 
2efb0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61  page */.  u8 *da
2efc0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
2efd0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
2efe0 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  parent page */. 
2eff0 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20   u8 *cdata;     
2f000 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2f010 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
2f020 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
2f030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2f040 66 73 65 74 20 74 6f 20 70 61 67 65 20 68 65 61  fset to page hea
2f050 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f  der in parent */
2f060 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
2f070 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2f080 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66   to content of f
2f090 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72  irst cell in par
2f0a0 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
2f0b0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2f0c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2f0d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 6e  ur->apPage[0]->n
2f0e0 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20  Overflow>0 );.. 
2f0f0 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d   VVA_ONLY( pCur-
2f100 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  >pagesShuffled =
2f110 20 31 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20   1 );.  pPage = 
2f120 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
2f130 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
2f140 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
2f150 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2f160 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2f170 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2f180 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2f190 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2f1a0 65 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c  e) );.  rc = all
2f1b0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2f1c0 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67  Bt, &pChild, &pg
2f1d0 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e  noChild, pPage->
2f1e0 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20  pgno, 0);.  if( 
2f1f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f200 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f210 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f220 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67  e(pChild->pDbPag
2f230 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  e) );.  usableSi
2f240 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
2f250 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70  Size;.  data = p
2f260 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
2f270 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2f280 66 66 73 65 74 3b 0a 20 20 63 62 72 6b 20 3d 20  ffset;.  cbrk = 
2f290 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2f2a0 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20  dr+5]);.  cdata 
2f2b0 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b  = pChild->aData;
2f2c0 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c  .  memcpy(cdata,
2f2d0 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61   &data[hdr], pPa
2f2e0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
2f2f0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64  *pPage->nCell-hd
2f300 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64  r);.  memcpy(&cd
2f310 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
2f320 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
2f330 7a 65 2d 63 62 72 6b 29 3b 0a 0a 20 20 61 73 73  ze-cbrk);..  ass
2f340 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49  ert( pChild->isI
2f350 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  nit==0 );.  rc =
2f360 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2f370 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  tPage(pChild);. 
2f380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f390 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43  OK ){.    int nC
2f3a0 6f 70 79 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76  opy = pPage->nOv
2f3b0 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50  erflow*sizeof(pP
2f3c0 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 3b 0a  age->aOvfl[0]);.
2f3d0 20 20 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c      memcpy(pChil
2f3e0 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d  d->aOvfl, pPage-
2f3f0 3e 61 4f 76 66 6c 2c 20 6e 43 6f 70 79 29 3b 0a  >aOvfl, nCopy);.
2f400 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65      pChild->nOve
2f410 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e  rflow = pPage->n
2f420 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66  Overflow;.    if
2f430 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66  ( pChild->nOverf
2f440 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 43 68  low ){.      pCh
2f450 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  ild->nFree = 0;.
2f460 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2f470 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
2f480 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
2f490 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2f4a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2f4b0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2f4c0 61 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  age) );.    zero
2f4d0 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2f4e0 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e  ld->aData[0] & ~
2f4f0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 70  PTF_LEAF);.    p
2f500 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
2f510 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2f520 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43  Offset+8], pgnoC
2f530 68 69 6c 64 29 3b 0a 20 20 20 20 54 52 41 43 45  hild);.    TRACE
2f540 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
2f550 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
2f560 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2f570 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
2f580 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  ;.    if( ISAUTO
2f590 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2f5a0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
2f5b0 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  Bt, pChild->pgno
2f5c0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2f5d0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69  pPage->pgno);.#i
2f5e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f5f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2f600 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f620 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
2f630 6d 61 70 73 28 70 43 68 69 6c 64 29 3b 0a 20 20  maps(pChild);.  
2f640 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f650 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  rc ){.        pC
2f660 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
2f670 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
2f680 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
2f690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f6a0 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  OK ){.    pCur->
2f6b0 69 50 61 67 65 2b 2b 3b 0a 20 20 20 20 70 43 75  iPage++;.    pCu
2f6c0 72 2d 3e 61 70 50 61 67 65 5b 31 5d 20 3d 20 70  r->apPage[1] = p
2f6d0 43 68 69 6c 64 3b 0a 20 20 20 20 70 43 75 72 2d  Child;.    pCur-
2f6e0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
2f6f0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2f700 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20  nonroot(pCur);. 
2f710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65   }else{.    rele
2f720 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
2f730 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2f740 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
2f750 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63  page that pCur c
2f760 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
2f770 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  to has just been
2f780 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20   modified in.** 
2f790 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66  some way. This f
2f7a0 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20  unction figures 
2f7b0 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69  out if this modi
2f7c0 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74  fication means t
2f7d0 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73  he.** tree needs
2f7e0 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c   to be balanced,
2f7f0 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73   and if so calls
2f800 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2f810 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72   balancing .** r
2f820 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50  outine..** .** P
2f830 61 72 61 6d 65 74 65 72 20 69 73 49 6e 73 65 72  arameter isInser
2f840 74 20 69 73 20 74 72 75 65 20 69 66 20 61 20 6e  t is true if a n
2f850 65 77 20 63 65 6c 6c 20 77 61 73 20 6a 75 73 74  ew cell was just
2f860 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
2f870 68 65 0a 2a 2a 20 70 61 67 65 2c 20 6f 72 20 66  he.** page, or f
2f880 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
2f890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2f8a0 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a  lance(BtCursor *
2f8b0 70 43 75 72 2c 20 69 6e 74 20 69 73 49 6e 73 65  pCur, int isInse
2f8c0 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rt){.  int rc = 
2f8d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2f8e0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2f8f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2f900 3e 69 50 61 67 65 5d 3b 0a 0a 20 20 61 73 73 65  >iPage];..  asse
2f910 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2f920 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2f930 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
2f940 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2f950 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
2f960 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f970 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2f980 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2f990 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
2f9a0 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a  >nOverflow>0 ){.
2f9b0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2f9c0 63 65 5f 64 65 65 70 65 72 28 70 43 75 72 29 3b  ce_deeper(pCur);
2f9d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f9e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d  Cur->apPage[0]==
2f9f0 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 61  pPage );.      a
2fa00 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2fa10 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63  verflow==0 || rc
2fa20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2fa30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2fa40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2fa50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
2fa60 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2fa70 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 43  nce_shallower(pC
2fa80 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ur);.      asser
2fa90 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2faa0 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20 20  0]==pPage );.   
2fab0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2fac0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
2fad0 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
2fae0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2faf0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
2fb00 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  >nOverflow>0 || 
2fb10 0a 20 20 20 20 20 20 20 20 28 21 69 73 49 6e 73  .        (!isIns
2fb20 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ert && pPage->nF
2fb30 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ree>pPage->pBt->
2fb40 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20  usableSize*2/3) 
2fb50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
2fb60 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43  lance_nonroot(pC
2fb70 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
2fb80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2fb90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2fba0 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72  e checks all cur
2fbb0 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20  sors that point 
2fbc0 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f  to table pgnoRoo
2fbd0 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  t..** If any of 
2fbe0 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65  those cursors we
2fbf0 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  re opened with w
2fc00 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69  rFlag==0 in a di
2fc10 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62  fferent.** datab
2fc20 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28  ase connection (
2fc30 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2fc40 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65  ction that share
2fc50 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  s the pager.** c
2fc60 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75  ache with the cu
2fc70 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
2fc80 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72  ) and that other
2fc90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
2fca0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65  is not in the Re
2fcb0 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73  adUncommmitted s
2fcc0 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20  tate, then this 
2fcd0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2fce0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  .** SQLITE_LOCKE
2fcf0 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c  D..**.** As well
2fd00 20 61 73 20 63 75 72 73 6f 72 73 20 77 69 74 68   as cursors with
2fd10 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72 73   wrFlag==0, curs
2fd20 6f 72 73 20 77 69 74 68 20 0a 2a 2a 20 69 73 49  ors with .** isI
2fd30 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31  ncrblobHandle==1
2fd40 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64   are also consid
2fd50 65 72 65 64 20 27 72 65 61 64 27 20 63 75 72 73  ered 'read' curs
2fd60 6f 72 73 20 62 65 63 61 75 73 65 0a 2a 2a 20 69  ors because.** i
2fd70 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2fd80 63 75 72 73 6f 72 73 20 61 72 65 20 75 73 65 64  cursors are used
2fd90 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e   for both readin
2fda0 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a  g and writing..*
2fdb0 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f  *.** When pgnoRo
2fdc0 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ot is the root p
2fdd0 61 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79  age of an intkey
2fde0 20 74 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e   table, this fun
2fdf0 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a  ction is also.**
2fe00 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2fe10 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 69 6e   invalidating in
2fe20 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
2fe30 75 72 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20  ursors when the 
2fe40 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20  table row.** on 
2fe50 77 68 69 63 68 20 74 68 65 79 20 61 72 65 20 6f  which they are o
2fe60 70 65 6e 65 64 20 69 73 20 64 65 6c 65 74 65 64  pened is deleted
2fe70 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20 43 75   or modified. Cu
2fe80 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
2fe90 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  dated.** accordi
2fea0 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ng to the follow
2feb0 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ing rules:.**.**
2fec0 20 20 20 31 29 20 57 68 65 6e 20 42 74 72 65 65     1) When Btree
2fed0 43 6c 65 61 72 54 61 62 6c 65 28 29 20 69 73 20  ClearTable() is 
2fee0 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
2fef0 74 65 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  tely delete the 
2ff00 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20  contents.**     
2ff10 20 6f 66 20 61 20 42 2d 54 72 65 65 20 74 61 62   of a B-Tree tab
2ff20 6c 65 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20  le, pExclude is 
2ff30 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20  set to zero and 
2ff40 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69  parameter iRow i
2ff50 73 20 0a 2a 2a 20 20 20 20 20 20 73 65 74 20 74  s .**      set t
2ff60 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  o non-zero. In t
2ff70 68 69 73 20 63 61 73 65 20 61 6c 6c 20 69 6e 63  his case all inc
2ff80 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
2ff90 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20  rsors open.**   
2ffa0 20 20 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20     on the table 
2ffb0 72 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f 52 6f  rooted at pgnoRo
2ffc0 6f 74 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  ot are invalidat
2ffd0 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57  ed..**.**   2) W
2ffe0 68 65 6e 20 42 74 72 65 65 49 6e 73 65 72 74 28  hen BtreeInsert(
2fff0 29 2c 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  ), BtreeDelete()
30000 20 6f 72 20 42 74 72 65 65 50 75 74 44 61 74 61   or BtreePutData
30010 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
30020 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66 79 20  .**      modify 
30030 61 20 74 61 62 6c 65 20 72 6f 77 20 76 69 61 20  a table row via 
30040 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
30050 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65  , pExclude is se
30060 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20  t to the .**    
30070 20 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 75    write cursor u
30080 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f  sed to do the mo
30090 64 69 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 70  dification and p
300a0 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73  arameter iRow is
300b0 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20   set.**      to 
300c0 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f 77 20  the integer row 
300d0 69 64 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65  id of the B-Tree
300e0 20 65 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f 64   entry being mod
300f0 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a  ified. Unless.**
30100 20 20 20 20 20 20 70 45 78 63 6c 75 64 65 20 69        pExclude i
30110 73 20 69 74 73 65 6c 66 20 61 6e 20 69 6e 63 72  s itself an incr
30120 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
30130 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e  sor, then all in
30140 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20  cremental.**    
30150 20 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f    blob cursors o
30160 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20  pen on row iRow 
30170 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61 72  of the B-Tree ar
30180 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
30190 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20 62 6f 74  *.**   3) If bot
301a0 68 20 70 45 78 63 6c 75 64 65 20 61 6e 64 20 69  h pExclude and i
301b0 52 6f 77 20 61 72 65 20 73 65 74 20 74 6f 20 7a  Row are set to z
301c0 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e  ero, no incremen
301d0 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20  tal blob .**    
301e0 20 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e    cursors are in
301f0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74  validated..*/.st
30200 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f  atic int checkFo
30210 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 0a  rReadConflicts(.
30220 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c    Btree *pBtree,
30230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
30250 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e  o check */.  Pgn
30260 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20  o pgnoRoot,     
30270 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72       /* Look for
30280 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
30290 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20   this btree */. 
302a0 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c   BtCursor *pExcl
302b0 75 64 65 2c 20 20 20 20 20 2f 2a 20 49 67 6e 6f  ude,     /* Igno
302c0 72 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  re this cursor *
302d0 2f 0a 20 20 69 36 34 20 69 52 6f 77 20 20 20 20  /.  i64 iRow    
302e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
302f0 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69  he rowid that mi
30300 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20  ght be changing 
30310 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
30320 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
30330 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
30340 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
30350 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a  b = pBtree->db;.
30360 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30370 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
30380 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
30390 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
303a0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
303b0 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78  {.    if( p==pEx
303c0 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65  clude ) continue
303d0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  ;.    if( p->pgn
303e0 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20  oRoot!=pgnoRoot 
303f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e  ) continue;.#ifn
30400 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30410 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28  INCRBLOB.    if(
30420 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61   p->isIncrblobHa
30430 6e 64 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20  ndle && ( .     
30440 20 20 20 20 28 21 70 45 78 63 6c 75 64 65 20 26      (!pExclude &
30450 26 20 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c  & iRow).      ||
30460 20 28 70 45 78 63 6c 75 64 65 20 26 26 20 21 70   (pExclude && !p
30470 45 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62  Exclude->isIncrb
30480 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e  lobHandle && p->
30490 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29  info.nKey==iRow)
304a0 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70  .    )){.      p
304b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
304c0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
304d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
304e0 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  p->eState!=CURSO
304f0 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e  R_VALID ) contin
30500 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77  ue;.    if( p->w
30510 72 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65  rFlag==0 .#ifnde
30520 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
30530 43 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70  CRBLOB.     || p
30540 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
30550 6c 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b  le.#endif.    ){
30560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
30570 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74  dbOther = p->pBt
30580 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 61  ree->db;.      a
30590 73 73 65 72 74 28 64 62 4f 74 68 65 72 29 3b 0a  ssert(dbOther);.
305a0 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65        if( dbOthe
305b0 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65  r!=db && (dbOthe
305c0 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  r->flags & SQLIT
305d0 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
305e0 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
305f0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
30600 6f 6e 42 6c 6f 63 6b 65 64 28 64 62 2c 20 64 62  onBlocked(db, db
30610 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Other);.        
30620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
30630 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
30640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30650 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
30660 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
30670 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
30680 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54  cord into the BT
30690 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73  ree.  The key is
306a0 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c   given by (pKey,
306b0 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65  nKey).** and the
306c0 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62   data is given b
306d0 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e  y (pData,nData).
306e0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
306f0 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20  used only to.** 
30700 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c  define what tabl
30710 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f  e the record sho
30720 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20  uld be inserted 
30730 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  into.  The curso
30740 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
30750 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f  nting at a rando
30760 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  m location..**.*
30770 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20  * For an INTKEY 
30780 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20  table, only the 
30790 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68  nKey value of th
307a0 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20  e key is used.  
307b0 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72  pKey is.** ignor
307c0 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44  ed.  For a ZEROD
307d0 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70  ATA table, the p
307e0 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61  Data and nData a
307f0 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e  re both ignored.
30800 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
30810 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74  treeInsert(.  Bt
30820 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30840 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
30850 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68   the table of th
30860 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63  is cursor */.  c
30870 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
30880 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
30890 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   The key of the 
308a0 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
308b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
308c0 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f  a, int nData,  /
308d0 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68  * The data of th
308e0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
308f0 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
30900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30910 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
30920 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61  tra 0 bytes to a
30930 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f  ppend to data */
30940 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61  .  int appendBia
30950 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
30960 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
30970 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61  s is likely an a
30980 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ppend */.){.  in
30990 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b  t rc;.  int loc;
309a0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20  .  int szNew;.  
309b0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
309c0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
309d0 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
309e0 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
309f0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
30a00 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
30a10 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
30a20 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
30a30 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ll = 0;..  asser
30a40 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
30a50 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
30a60 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
30a70 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
30a80 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
30a90 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
30aa0 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ly );.  assert( 
30ab0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a  pCur->wrFlag );.
30ac0 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52    rc = checkForR
30ad0 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 43 75  eadConflicts(pCu
30ae0 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d  r->pBtree, pCur-
30af0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c  >pgnoRoot, pCur,
30b00 20 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 72 63   nKey);.  if( rc
30b10 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
30b20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
30b30 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
30b40 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
30b50 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
30b60 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
30b70 44 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 3b  D_SHAREDCACHE );
30b80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
30b90 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
30ba0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
30bb0 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
30bc0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
30bd0 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
30be0 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
30bf0 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
30c00 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
30c10 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
30c20 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
30c30 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a 20  (pCur);.  if( . 
30c40 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
30c50 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
30c60 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
30c70 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c  noRoot, pCur)) |
30c80 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  |.    SQLITE_OK!
30c90 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  =(rc = sqlite3Bt
30ca0 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
30cb0 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65  pKey, nKey, appe
30cc0 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20  ndBias, &loc)). 
30cd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
30ce0 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20  c;.  }..  pPage 
30cf0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
30d00 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
30d10 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
30d20 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
30d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30d40 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
30d50 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
30d60 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
30d70 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
30d80 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
30d90 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
30da0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
30db0 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
30dc0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
30dd0 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
30de0 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
30df0 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
30e00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
30e10 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f  isInit );.  allo
30e20 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
30e30 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20  t);.  newCell = 
30e40 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
30e50 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30    if( newCell==0
30e60 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
30e70 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66  _NOMEM;.  rc = f
30e80 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c  illInCell(pPage,
30e90 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20   newCell, pKey, 
30ea0 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61  nKey, pData, nDa
30eb0 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65  ta, nZero, &szNe
30ec0 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  w);.  if( rc ) g
30ed0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
30ee0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d    assert( szNew=
30ef0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
30f00 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a  ge, newCell) );.
30f10 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c    assert( szNew<
30f20 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42  =MX_CELL_SIZE(pB
30f30 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43  t) );.  idx = pC
30f40 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
30f50 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f  iPage];.  if( lo
30f60 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56  c==0 && CURSOR_V
30f70 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
30f80 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  te ){.    u16 sz
30f90 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Old;.    assert(
30fa0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
30fb0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  l );.    rc = sq
30fc0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30fd0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
30fe0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
30ff0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
31000 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sert;.    }.    
31010 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65  oldCell = findCe
31020 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  ll(pPage, idx);.
31030 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
31040 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65  leaf ){.      me
31050 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c  mcpy(newCell, ol
31060 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d  dCell, 4);.    }
31070 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c  .    szOld = cel
31080 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
31090 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63  oldCell);.    rc
310a0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
310b0 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
310c0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
310d0 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
310e0 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50  rc = dropCell(pP
310f0 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29  age, idx, szOld)
31100 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
31110 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
31120 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
31130 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
31140 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
31150 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
31160 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31170 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69  e->leaf );.    i
31180 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
31190 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
311a0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
311b0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
311c0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
311d0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
311e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
311f0 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
31200 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
31210 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c  age, idx, newCel
31220 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
31230 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
31240 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
31250 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 31   balance(pCur, 1
31260 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 75 73  );.  }..  /* Mus
31270 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76 65  t make sure nOve
31280 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74 20 74  rflow is reset t
31290 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 74  o zero even if t
312a0 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20 20 2a  he balance().  *
312b0 2a 20 66 61 69 6c 73 2e 20 20 49 6e 74 65 72 6e  * fails.  Intern
312c0 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
312d0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c  e corruption wil
312e0 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 72 77 69  l result otherwi
312f0 73 65 2e 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 61  se. */.  pCur->a
31300 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
31310 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  e]->nOverflow = 
31320 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0;..  if( rc==SQ
31330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
31340 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
31350 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a  .  }.end_insert:
31360 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31370 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
31380 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
31390 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
313a0 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72  ing to.  The cur
313b0 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
313c0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62  ointing at a arb
313d0 69 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  itrary location.
313e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
313f0 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72  treeDelete(BtCur
31400 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
31410 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
31420 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
31430 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e 74 20  ->iPage];.  int 
31440 69 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  idx;.  unsigned 
31450 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69  char *pCell;.  i
31460 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67  nt rc;.  Pgno pg
31470 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42  noChild = 0;.  B
31480 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
31490 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
314a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
314b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
314c0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
314d0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
314e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
314f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
31500 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
31510 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
31520 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
31530 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28  eadOnly );.  if(
31540 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
31550 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
31560 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
31570 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20  skip;.  }.  if( 
31580 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64  NEVER(pCur->aiId
31590 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
315a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 20 29 7b  pPage->nCell) ){
315b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
315c0 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
315d0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
315e0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
315f0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  hing */.  }.  as
31600 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c  sert( pCur->wrFl
31610 61 67 20 29 3b 0a 20 20 72 63 20 3d 20 63 68 65  ag );.  rc = che
31620 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63  ckForReadConflic
31630 74 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  ts(p, pCur->pgno
31640 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72  Root, pCur, pCur
31650 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20  ->info.nKey);.  
31660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31670 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
31680 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
31690 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
316a0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 61 73 73 65  lock */.    asse
316b0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c  rt( rc==SQLITE_L
316c0 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
316d0 45 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E );.    return 
316e0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  rc;.  }..  /* Re
316f0 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
31700 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
31710 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  n (a no-op if th
31720 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
31730 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f  in .  ** CURSOR_
31740 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74  REQUIRESEEK stat
31750 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20  e) and save the 
31760 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
31770 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a   other cursors .
31780 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65    ** open on the
31790 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65   same table. The
317a0 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  n call sqlite3Pa
317b0 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
317c0 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74  e page.  ** that
317d0 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20   the entry will 
317e0 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e  be deleted from.
317f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
31800 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75   (rc = restoreCu
31810 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
31820 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
31830 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
31840 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
31850 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d  noRoot, pCur))!=
31860 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
31870 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31880 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31890 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  )!=0.  ){.    re
318a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
318b0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65  /* Locate the ce
318c0 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70 61  ll within its pa
318d0 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65  ge and leave pCe
318e0 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ll pointing to t
318f0 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68  he.  ** data. Th
31900 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61  e clearCell() ca
31910 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65  ll frees any ove
31920 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
31930 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
31940 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63    ** cell. The c
31950 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74  ell itself is st
31960 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f  ill intact..  */
31970 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  .  idx = pCur->a
31980 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
31990 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  ];.  pCell = fin
319a0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
319b0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
319c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
319d0 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74  oChild = get4byt
319e0 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  e(pCell);.  }.  
319f0 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
31a00 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
31a10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
31a20 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
31a30 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
31a40 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
31a50 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61  * The entry we a
31a60 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65  re about to dele
31a70 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  te is not a leaf
31a80 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   so if we do not
31a90 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74  .    ** do somet
31aa0 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61  hing we will lea
31ab0 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20  ve a hole on an 
31ac0 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20  internal page.. 
31ad0 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f     ** We have to
31ae0 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62   fill the hole b
31af0 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65  y moving in a ce
31b00 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20  ll from a leaf. 
31b10 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   The.    ** next
31b20 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20   Cell after the 
31b30 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  one to be delete
31b40 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  d is guaranteed 
31b50 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20  to exist and.   
31b60 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66   ** to be a leaf
31b70 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69   so we can use i
31b80 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74  t..    */.    Bt
31b90 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a  Cursor leafCur;.
31ba0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65      MemPage *pLe
31bb0 61 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  afPage = 0;..   
31bc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
31bd0 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e  pNext;.    int n
31be0 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69  otUsed;.    unsi
31bf0 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43  gned char *tempC
31c00 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ell = 0;.    ass
31c10 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69 6e 74  ert( !pPage->int
31c20 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
31c30 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
31c40 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66  rsor(pCur, &leaf
31c50 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Cur);.    rc = s
31c60 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
31c70 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73  &leafCur, &notUs
31c80 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
31c90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31ca0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
31cb0 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43 75  Cur.aiIdx[leafCu
31cc0 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20  r.iPage]==0 );. 
31cd0 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d       pLeafPage =
31ce0 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b   leafCur.apPage[
31cf0 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a  leafCur.iPage];.
31d00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31d10 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65  e3PagerWrite(pLe
31d20 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  afPage->pDbPage)
31d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31d50 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 61 66 43  .      int leafC
31d60 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 30  ursorInvalid = 0
31d70 3b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65  ;.      u16 szNe
31d80 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  xt;.      TRACE(
31d90 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d  ("DELETE: table=
31da0 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e  %d delete intern
31db0 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61  al from %d repla
31dc0 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c  ce from leaf %d\
31dd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75  n",.         pCu
31de0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
31df0 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66 50  ge->pgno, pLeafP
31e00 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
31e10 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
31e20 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65  e, idx, cellSize
31e30 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
31e40 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  ));.      pNext 
31e50 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66  = findCell(pLeaf
31e60 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Page, 0);.      
31e70 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a  szNext = cellSiz
31e80 65 50 74 72 28 70 4c 65 61 66 50 61 67 65 2c 20  ePtr(pLeafPage, 
31e90 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73  pNext);.      as
31ea0 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  sert( MX_CELL_SI
31eb0 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b  ZE(pBt)>=szNext+
31ec0 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63  4 );.      alloc
31ed0 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
31ee0 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c  );.      tempCel
31ef0 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  l = pBt->pTmpSpa
31f00 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  ce;.      if( te
31f10 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  mpCell==0 ){.   
31f20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31f30 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
31f40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31f60 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
31f70 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 70  ll(pPage, idx, p
31f80 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34  Next-4, szNext+4
31f90 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a  , tempCell, 0);.
31fa0 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
31fb0 2f 2a 20 54 68 65 20 22 69 66 22 20 73 74 61 74  /* The "if" stat
31fc0 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e 65 78  ement in the nex
31fd0 74 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73 20  t code block is 
31fe0 63 72 69 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  critical.  The. 
31ff0 20 20 20 20 20 2a 2a 20 73 6c 69 67 68 74 65 73       ** slightes
32000 74 20 65 72 72 6f 72 20 69 6e 20 74 68 61 74 20  t error in that 
32010 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20  statement would 
32020 61 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f 20  allow SQLite to 
32030 6f 70 65 72 61 74 65 0a 20 20 20 20 20 20 2a 2a  operate.      **
32040 20 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74 20   correctly most 
32050 6f 66 20 74 68 65 20 74 69 6d 65 20 62 75 74 20  of the time but 
32060 70 72 6f 64 75 63 65 20 76 65 72 79 20 72 61 72  produce very rar
32070 65 20 66 61 69 6c 75 72 65 73 2e 20 20 54 6f 0a  e failures.  To.
32080 20 20 20 20 20 20 2a 2a 20 67 75 61 72 64 20 61        ** guard a
32090 67 61 69 6e 73 74 20 74 68 69 73 2c 20 74 68 65  gainst this, the
320a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
320b0 73 20 68 65 6c 70 20 74 6f 20 76 65 72 69 66 79  s help to verify
320c0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
320d0 68 65 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e  he "if" statemen
320e0 74 20 69 73 20 77 65 6c 6c 20 74 65 73 74 65 64  t is well tested
320f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32100 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
32110 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
32120 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 70  & pPage->nFree<p
32130 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
32140 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  /3 .            
32150 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67       && pLeafPag
32160 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
32170 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
32180 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20  ize*2/3 );.     
32190 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
321a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
321b0 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d  & pPage->nFree==
321c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
321d0 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20  2/3 .           
321e0 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
321f0 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
32200 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
32210 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
32220 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
32230 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
32240 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d  && pPage->nFree=
32250 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
32260 2a 32 2f 33 2b 31 20 0a 20 20 20 20 20 20 20 20  *2/3+1 .        
32270 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61           && pLea
32280 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
32290 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
322a0 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20  bleSize*2/3 );. 
322b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
322c0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
322d0 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  0 && pPage->nFre
322e0 65 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e<=pBt->usableSi
322f0 7a 65 2a 32 2f 33 0a 20 20 20 20 20 20 20 20 20  ze*2/3.         
32300 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66          && pLeaf
32310 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
32320 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
32330 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20  leSize*2/3 );.  
32340 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
32350 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
32360 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72  0 || (pPage->nFr
32370 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee > pBt->usable
32380 53 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20 20  Size*2/3)).     
32390 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
323a0 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b  LeafPage->nFree+
323b0 32 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74 2d  2+szNext == pBt-
323c0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
323d0 29 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 28  );...      if( (
323e0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
323f0 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46  >0 || (pPage->nF
32400 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ree > pBt->usabl
32410 65 53 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a 20  eSize*2/3)) &&. 
32420 20 20 20 20 20 20 20 20 20 28 70 4c 65 61 66 50           (pLeafP
32430 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
32440 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
32450 65 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20 20  eSize*2/3).     
32460 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
32470 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
32480 6b 65 6e 20 69 66 20 74 68 65 20 69 6e 74 65 72  ken if the inter
32490 6e 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77 20  nal node is now 
324a0 65 69 74 68 65 72 20 6f 76 65 72 66 6c 6f 77 69  either overflowi
324b0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  ng.        ** or
324c0 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 74   underfull and t
324d0 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 6c  he leaf node wil
324e0 6c 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 20 61  l be underfull a
324f0 66 74 65 72 20 74 68 65 20 6a 75 73 74 20 63 65  fter the just ce
32500 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ll .        ** c
32510 6f 70 69 65 64 20 74 6f 20 74 68 65 20 69 6e 74  opied to the int
32520 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64 65  ernal node is de
32530 6c 65 74 65 64 20 66 72 6f 6d 20 69 74 2e 20 54  leted from it. T
32540 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61 6c  his is a special
32550 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
32560 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
32570 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 74  l to balance() t
32580 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20 69 6e  o correct the in
32590 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20 20  ternal node.    
325a0 20 20 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e 67      ** may chang
325b0 65 20 74 68 65 20 74 72 65 65 20 73 74 72 75 63  e the tree struc
325c0 74 75 72 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  ture and invalid
325d0 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ate the contents
325e0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
325f0 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67  he leafCur.apPag
32600 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e  e[] and leafCur.
32610 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 2c 20  aiIdx[] arrays, 
32620 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 20 20  which will be.  
32630 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79        ** used by
32640 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72   the balance() r
32650 65 71 75 69 72 65 64 20 74 6f 20 63 6f 72 72 65  equired to corre
32660 63 74 20 74 68 65 20 75 6e 64 65 72 66 75 6c 6c  ct the underfull
32670 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a   leaf.        **
32680 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a   node..        *
32690 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
326a0 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 69 6e   formula used in
326b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
326c0 61 62 6f 76 65 20 61 72 65 20 62 61 73 65 64 20  above are based 
326d0 6f 6e 20 66 61 63 65 74 73 20 6f 66 0a 20 20 20  on facets of.   
326e0 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69       ** the SQLi
326f0 74 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20 74  te file-format t
32700 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  hat do not chang
32710 65 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20 20  e over time..   
32720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32730 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
32740 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61  >nFree==pBt->usa
32750 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b  bleSize*2/3+1 );
32760 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
32770 65 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46  e( pLeafPage->nF
32780 72 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70 42  ree+2+szNext==pB
32790 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
327a0 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6c  3+1 );.        l
327b0 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64  eafCursorInvalid
327c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 20 20   = 1;.      }   
327d0 20 20 20 20 20 0a 0a 20 20 20 20 20 20 69 66 28       ..      if(
327e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
327f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
32800 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
32810 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
32820 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
32830 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
32840 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
32850 50 61 67 65 2c 20 69 64 78 29 2c 20 70 67 6e 6f  Page, idx), pgno
32860 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
32870 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
32880 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
32890 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
328a0 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20  = balance(pCur, 
328b0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
328c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
328d0 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75 72 73  E_OK && leafCurs
328e0 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20 20  orInvalid ){.   
328f0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 61 66       /* The leaf
32900 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e 64  -node is now und
32910 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74 68  erfull and so th
32920 65 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20  e tree needs to 
32930 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  be .        ** r
32940 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65 76  ebalanced. Howev
32950 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63 65 28  er, the balance(
32960 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74  ) operation on t
32970 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20  he internal.    
32980 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f 76      ** node abov
32990 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64 69 66  e may have modif
329a0 69 65 64 20 74 68 65 20 73 74 72 75 63 74 75 72  ied the structur
329b0 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20  e of the B-Tree 
329c0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
329d0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  o the current co
329e0 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66 43 75  ntents of leafCu
329f0 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c  r.apPage[] and l
32a00 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a 20  eafCur.aiIdx[]. 
32a10 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f         ** may no
32a20 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 20 20  t be trusted..  
32a30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32a40 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   ** It is not po
32a50 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79 20 74  ssible to copy t
32a60 68 65 20 61 6e 63 65 73 74 72 79 20 66 72 6f 6d  he ancestry from
32a70 20 70 43 75 72 2c 20 61 73 20 74 68 65 20 73 61   pCur, as the sa
32a80 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  me.        ** ba
32a90 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68 61 73  lance() call has
32aa0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74 68 65   invalidated the
32ab0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d 20   pCur->apPage[] 
32ac0 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20 20 20  and aiIdx[].    
32ad0 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 0a      ** arrays. .
32ae0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
32af0 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74     ** The call t
32b00 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  o saveCursorPosi
32b10 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e 74  tion() below int
32b20 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20 74 68  ernally saves th
32b30 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  e .        ** ke
32b40 79 20 74 68 61 74 20 6c 65 61 66 43 75 72 20 69  y that leafCur i
32b50 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
32b60 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e 74  ting to. Current
32b70 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20 20 20  ly, there.      
32b80 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f 70    ** are two cop
32b90 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65 79 20  ies of that key 
32ba0 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20 6f 6e  in the tree - on
32bb0 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 65  e here on the le
32bc0 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  af.        ** pa
32bd0 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73 6f  ge and one on so
32be0 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  me internal node
32bf0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20 54 68   in the tree. Th
32c00 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20 20  e copy on.      
32c10 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f    ** the leaf no
32c20 64 65 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  de is always the
32c30 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74 72 65   next key in tre
32c40 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20 74 68  e-order after th
32c50 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  e .        ** co
32c60 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e  py on the intern
32c70 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68 65  al node. So, the
32c80 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
32c90 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20 20 20  BtreeNext().    
32ca0 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65 73      ** calls res
32cb0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
32cc0 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20 74 68  on() to point th
32cd0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
32ce0 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  copy.        ** 
32cf0 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 69 6e  stored on the in
32d00 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68 65  ternal node, the
32d10 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20 74 68  n advances to th
32d20 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20 20  e next entry,.  
32d30 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 68        ** which h
32d40 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65  appens to be the
32d50 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b 65 79   copy of the key
32d60 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   on the internal
32d70 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a   node..        *
32d80 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20 6c 65  * Net effect: le
32d90 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e  afCur is pointin
32da0 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 75  g back to the du
32db0 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20 20 20  plicate cell.   
32dc0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e 65 65       ** that nee
32dd0 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ds to be removed
32de0 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66 43 75  , and the leafCu
32df0 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a 20  r.apPage[] and. 
32e00 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66 43 75         ** leafCu
32e10 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  r.aiIdx[] arrays
32e20 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 20 20   are correct..  
32e30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
32e40 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f 20   VVA_ONLY( Pgno 
32e50 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61 66  leafPgno = pLeaf
32e60 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
32e70 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43        rc = saveC
32e80 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26 6c  ursorPosition(&l
32e90 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20 20 20  eafCur);.       
32ea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32eb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32ec0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
32ed0 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20  eNext(&leafCur, 
32ee0 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 20  &notUsed);.     
32ef0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 65     }.        pLe
32f00 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72  afPage = leafCur
32f10 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e  .apPage[leafCur.
32f20 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 20 20  iPage];.        
32f30 61 73 73 65 72 74 28 20 70 4c 65 61 66 50 61 67  assert( pLeafPag
32f40 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50 67 6e  e->pgno==leafPgn
32f50 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  o );.        ass
32f60 65 72 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49  ert( leafCur.aiI
32f70 64 78 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65  dx[leafCur.iPage
32f80 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ]==0 );.      }.
32f90 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
32fa0 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20 20  E_OK==rc.       
32fb0 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
32fc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32fd0 57 72 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d  Write(pLeafPage-
32fe0 3e 70 44 62 50 61 67 65 29 29 20 0a 20 20 20 20  >pDbPage)) .    
32ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 72 6f    ){.        dro
33000 70 43 65 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c  pCell(pLeafPage,
33010 20 30 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20   0, szNext);.   
33020 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6c       VVA_ONLY( l
33030 65 61 66 43 75 72 2e 70 61 67 65 73 53 68 75 66  eafCur.pagesShuf
33040 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20  fled = 0 );.    
33050 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
33060 28 26 6c 65 61 66 43 75 72 2c 20 30 29 3b 0a 20  (&leafCur, 0);. 
33070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
33080 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64  eafCursorInvalid
33090 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e 70 61 67   || !leafCur.pag
330a0 65 73 53 68 75 66 66 6c 65 64 0a 20 20 20 20 20  esShuffled.     
330b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
330d0 20 21 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75   !pCur->pagesShu
330e0 66 66 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ffled );.      }
330f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
33100 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
33110 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75  mpCursor(&leafCu
33120 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
33130 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a   TRACE(("DELETE:
33140 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65   table=%d delete
33150 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
33160 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ,.       pCur->p
33170 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
33180 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d  pgno));.    rc =
33190 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
331a0 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74   idx, cellSizePt
331b0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
331c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
331d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
331e0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43   rc = balance(pC
331f0 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ur, 0);.    }.  
33200 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
33210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
33220 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
33230 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33240 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
33250 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c  a new BTree tabl
33260 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  e.  Write into *
33270 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65  piTable the page
33280 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
33290 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
332a0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  the new table..*
332b0 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66  *.** The type of
332c0 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69   type is determi
332d0 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73  ned by the flags
332e0 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c   parameter.  Onl
332f0 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  y the.** followi
33300 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61  ng values of fla
33310 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  gs are currently
33320 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20   in use.  Other 
33330 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c  values for.** fl
33340 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f  ags might not wo
33350 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54  rk:.**.**     BT
33360 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45  REE_INTKEY|BTREE
33370 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73  _LEAFDATA     Us
33380 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65  ed for SQL table
33390 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79  s with rowid key
333a0 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a  s.**     BTREE_Z
333b0 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20  ERODATA         
333c0 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f           Used fo
333d0 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f  r SQL indices.*/
333e0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
333f0 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
33400 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
33410 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
33420 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
33430 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
33440 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50  Page *pRoot;.  P
33450 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  gno pgnoRoot;.  
33460 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
33470 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
33480 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
33490 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
334a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
334b0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
334c0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
334d0 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66  dOnly );..#ifdef
334e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
334f0 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61  OVACUUM.  rc = a
33500 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
33510 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
33520 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
33530 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
33540 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
33550 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e  else.  if( pBt->
33560 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
33570 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b    Pgno pgnoMove;
33580 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20        /* Move a 
33590 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b  page here to mak
335a0 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72  e room for the r
335b0 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20  oot-page */.    
335c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f  MemPage *pPageMo
335d0 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ve; /* The page 
335e0 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a  to move to. */..
335f0 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20      /* Creating 
33600 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20  a new table may 
33610 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65  probably require
33620 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74   moving an exist
33630 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20  ing database.   
33640 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d   ** to make room
33650 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
33660 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49  les root page. I
33670 6e 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65  n case this page
33680 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75   turns.    ** ou
33690 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66  t to be an overf
336a0 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65  low page, delete
336b0 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61   all overflow pa
336c0 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20  ge-map caches.  
336d0 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65    ** held by ope
336e0 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a  n cursors..    *
336f0 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  /.    invalidate
33700 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
33710 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  (pBt);..    /* R
33720 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ead the value of
33730 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68   meta[3] from th
33740 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65  e database to de
33750 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68  termine where th
33760 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61  e.    ** root pa
33770 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
33780 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d  ble should go. m
33790 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61  eta[3] is the la
337a0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
337b0 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73      ** created s
337c0 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65  o far, so the ne
337d0 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28  w root-page is (
337e0 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20  meta[3]+1)..    
337f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
33800 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
33810 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29  p, 4, &pgnoRoot)
33820 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
33830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33840 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33850 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b  }.    pgnoRoot++
33860 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;..    /* The ne
33870 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20  w root-page may 
33880 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
33890 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   on a pointer-ma
338a0 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20  p page, or the. 
338b0 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
338c0 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  TE page..    */.
338d0 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52      while( pgnoR
338e0 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  oot==PTRMAP_PAGE
338f0 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  NO(pBt, pgnoRoot
33900 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e  ) ||.        pgn
33910 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  oRoot==PENDING_B
33920 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
33930 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b  .      pgnoRoot+
33940 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  +;.    }.    ass
33950 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33  ert( pgnoRoot>=3
33960 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f   );..    /* Allo
33970 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65  cate a page. The
33980 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65   page that curre
33990 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20  ntly resides at 
339a0 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20  pgnoRoot will.  
339b0 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f    ** be moved to
339c0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
339d0 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20  age (unless the 
339e0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
339f0 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f  appens.    ** to
33a00 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52   reside at pgnoR
33a10 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oot)..    */.   
33a20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
33a30 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50  reePage(pBt, &pP
33a40 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f  ageMove, &pgnoMo
33a50 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ve, pgnoRoot, 1)
33a60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
33a70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33a90 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d  }..    if( pgnoM
33aa0 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b  ove!=pgnoRoot ){
33ab0 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f  .      /* pgnoRo
33ac0 6f 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ot is the page t
33ad0 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
33ae0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
33af0 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ge of.      ** t
33b00 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73  he new table (as
33b10 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  suming an error 
33b20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20  did not occur). 
33b30 42 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20  But we were.    
33b40 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
33b50 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75  gnoMove. If requ
33b60 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74  ired (i.e. if it
33b70 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74   was not allocat
33b80 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65  ed.      ** by e
33b90 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c  xtending the fil
33ba0 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20  e), the current 
33bb0 70 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e  page at position
33bc0 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20   pgnoMove.      
33bd0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f  ** is already jo
33be0 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a  urnaled..      *
33bf0 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  /.      u8 eType
33c00 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74  ;.      Pgno iPt
33c10 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65  rPage;..      re
33c20 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d  leasePage(pPageM
33c30 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ove);..      /* 
33c40 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75  Move the page cu
33c50 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52  rrently at pgnoR
33c60 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e  oot to pgnoMove.
33c70 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
33c80 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
33c90 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
33ca0 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
33cb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33cd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33ce0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
33cf0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67  trmapGet(pBt, pg
33d00 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20  noRoot, &eType, 
33d10 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
33d20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33d30 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  _OK || eType==PT
33d40 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c  RMAP_ROOTPAGE ||
33d50 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
33d60 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
33d70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
33d80 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
33d90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
33da0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
33db0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
33dc0 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  OTPAGE );.      
33dd0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
33de0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
33df0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c  ;.      rc = rel
33e00 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
33e10 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74  Root, eType, iPt
33e20 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c  rPage, pgnoMove,
33e30 20 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61   0);.      relea
33e40 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a  sePage(pRoot);..
33e50 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
33e60 74 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f  the page at pgno
33e70 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  Root */.      if
33e80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33e90 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
33ea0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
33eb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33ec0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
33ed0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
33ee0 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ot, 0);.      if
33ef0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33f00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
33f10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
33f20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33f30 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
33f40 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33f50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33f60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
33f70 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
33f80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
33f90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
33fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
33fb0 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65  Root = pPageMove
33fc0 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a  ;.    } ..    /*
33fd0 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   Update the poin
33fe0 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61  ter-map and meta
33ff0 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e  -data with the n
34000 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  ew root-page num
34010 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ber. */.    rc =
34020 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
34030 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50  pgnoRoot, PTRMAP
34040 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20  _ROOTPAGE, 0);. 
34050 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
34060 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
34070 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
34080 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
34090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
340a0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
340b0 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20   4, pgnoRoot);. 
340c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
340d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
340e0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
340f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
34100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
34110 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
34120 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
34130 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
34140 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
34150 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
34160 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73  ndif.  assert( s
34170 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
34180 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44  teable(pRoot->pD
34190 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f  bPage) );.  zero
341a0 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67  Page(pRoot, flag
341b0 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  s | PTF_LEAF);. 
341c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
341d0 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  ef(pRoot->pDbPag
341e0 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d  e);.  *piTable =
341f0 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a   (int)pgnoRoot;.
34200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34210 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
34220 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
34230 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
34240 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
34250 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
34260 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
34270 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
34280 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
34290 72 63 20 3d 20 62 74 72 65 65 43 72 65 61 74 65  rc = btreeCreate
342a0 54 61 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65  Table(p, piTable
342b0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  , flags);.  sqli
342c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
342d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
342e0 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68  ../*.** Erase th
342f0 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
34300 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74   page and all it
34310 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74  s children.  Ret
34320 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  urn.** the page 
34330 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
34340 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
34350 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
34360 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
34370 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
34380 54 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63  The BTree that c
34390 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c  ontains the tabl
343a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
343b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
343c0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  Page number to c
343d0 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72  lear */.  int fr
343e0 65 65 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20  eePageFlag,     
343f0 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61  /* Deallocate pa
34400 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  ge if true */.  
34410 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b  int *pnChange.){
34420 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
34430 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  e = 0;.  int rc;
34440 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
34450 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pCell;.  int i
34460 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
34470 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
34480 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
34490 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50   if( pgno>pagerP
344a0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
344b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
344c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
344d0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74  .  }..  rc = get
344e0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
344f0 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a   pgno, &pPage);.
34500 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34510 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
34520 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30  e_out;.  for(i=0
34530 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
34540 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c  ; i++){.    pCel
34550 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
34560 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ge, i);.    if( 
34570 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
34580 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72        rc = clear
34590 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
345a0 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
345b0 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b  ), 1, pnChange);
345c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
345d0 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
345e0 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  sepage_out;.    
345f0 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  }.    rc = clear
34600 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
34610 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
34620 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
34630 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
34640 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
34650 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  eaf ){.    rc = 
34660 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
34670 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
34680 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d  &pPage->aData[8]
34690 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b  ), 1, pnChange);
346a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
346b0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
346c0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73  page_out;.  }els
346d0 65 20 69 66 28 20 70 6e 43 68 61 6e 67 65 20 29  e if( pnChange )
346e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
346f0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
34700 20 20 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20     *pnChange += 
34710 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
34720 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67 65  }.  if( freePage
34730 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  Flag ){.    rc =
34740 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
34750 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72  ;.  }else if( (r
34760 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34770 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
34780 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20  Page))==0 ){.   
34790 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
347a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
347b0 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
347c0 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65  }..cleardatabase
347d0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65  page_out:.  rele
347e0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
347f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34800 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c  /*.** Delete all
34810 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
34820 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  m a single table
34830 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
34840 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20  .  iTable is.** 
34850 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
34860 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  of the root of t
34870 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72  he table.  After
34880 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
34890 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f  turns,.** the ro
348a0 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79  ot page is empty
348b0 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73  , but still exis
348c0 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ts..**.** This r
348d0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c  outine will fail
348e0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43   with SQLITE_LOC
348f0 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65  KED if there are
34900 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61   any open.** rea
34910 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  d cursors on the
34920 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72   table.  Open wr
34930 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
34940 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
34950 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
34960 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 68  e..**.** If pnCh
34970 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ange is not NULL
34980 2c 20 74 68 65 6e 20 74 61 62 6c 65 20 69 54 61  , then table iTa
34990 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6e 20 69  ble must be an i
349a0 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20 54 68 65  ntkey table. The
349b0 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75  .** integer valu
349c0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
349d0 70 6e 43 68 61 6e 67 65 20 69 73 20 69 6e 63 72  pnChange is incr
349e0 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e  emented by the n
349f0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72  umber of.** entr
34a00 69 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ies in the table
34a10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
34a20 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
34a30 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
34a40 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68 61  able, int *pnCha
34a50 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nge){.  int rc;.
34a60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
34a70 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
34a80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
34a90 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
34aa0 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
34ab0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
34ac0 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
34ad0 28 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65  (rc = checkForRe
34ae0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
34af0 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53  Table, 0, 1))!=S
34b00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34b10 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
34b20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
34b30 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
34b40 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
34b50 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
34b60 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
34b70 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
34b80 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  lse{.    rc = cl
34b90 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
34ba0 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
34bb0 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b  e, 0, pnChange);
34bc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
34bd0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
34be0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
34bf0 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66  ** Erase all inf
34c00 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61  ormation in a ta
34c10 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ble and add the 
34c20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
34c30 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65  e to.** the free
34c40 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74  list.  Except, t
34c50 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70  he root of the p
34c60 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28  rinciple table (
34c70 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61  the one on.** pa
34c80 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61  ge 1) is never a
34c90 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
34ca0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
34cb0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
34cc0 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
34cd0 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
34ce0 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63  re any open.** c
34cf0 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
34d00 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55  ble..**.** If AU
34d10 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62  TOVACUUM is enab
34d20 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  led and the page
34d30 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f   at iTable is no
34d40 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f  t the last.** ro
34d50 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
34d60 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
34d70 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  en the last root
34d80 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65   page .** in the
34d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
34da0 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65  s moved into the
34db0 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
34dc0 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54  ccupied by.** iT
34dd0 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61  able and that la
34de0 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  st slot formerly
34df0 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65   occupied by the
34e00 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a   last root page.
34e10 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
34e20 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74  he freelist inst
34e30 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20  ead of iTable.  
34e40 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c  In this say, all
34e50 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61  .** root pages a
34e60 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62  re kept at the b
34e70 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
34e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
34e90 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73  hich.** is neces
34ea0 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43  sary for AUTOVAC
34eb0 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68  UUM to work righ
34ec0 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  t.  *piMoved is 
34ed0 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70  set to the .** p
34ee0 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
34ef0 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  used to be the l
34f00 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ast root page in
34f10 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
34f20 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49  .** the move.  I
34f30 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d  f no page gets m
34f40 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69  oved, *piMoved i
34f50 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54  s set to 0..** T
34f60 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
34f70 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e  e is recorded in
34f80 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65   meta[3] and the
34f90 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74   value of.** met
34fa0 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20  a[3] is updated 
34fb0 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  by this procedur
34fc0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
34fd0 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
34fe0 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
34ff0 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
35000 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
35010 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35020 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
35030 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
35040 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35050 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
35060 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
35070 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
35080 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20  ANS_WRITE );..  
35090 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
350a0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
350b0 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
350c0 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
350d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
350e0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
350f0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
35100 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
35110 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
35120 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
35130 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
35140 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
35150 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
35160 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
35170 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
35180 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
35190 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
351a0 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
351b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
351c0 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
351d0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
351e0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
351f0 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d  pCursor->pBtree-
35200 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
35210 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
35220 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
35230 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
35240 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
35250 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26   (Pgno)iTable, &
35260 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
35270 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
35280 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
35290 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70  treeClearTable(p
352a0 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
352b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
352c0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
352d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
352e0 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64  .  }..  *piMoved
352f0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61   = 0;..  if( iTa
35300 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20  ble>1 ){.#ifdef 
35310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35320 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20  VACUUM.    rc = 
35330 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
35340 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
35350 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20  (pPage);.#else. 
35360 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
35370 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
35380 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  Pgno maxRootPgno
35390 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
353a0 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
353b0 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50  (p, 4, &maxRootP
353c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
353d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
353e0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
353f0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
35400 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
35410 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
35420 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f  f( iTable==maxRo
35430 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  otPgno ){.      
35440 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
35450 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
35460 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  is the table wit
35470 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  h the largest ro
35480 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
35490 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ** number in the
354a0 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20 74   database, put t
354b0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20  he root page on 
354c0 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a  the free list. .
354d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
354e0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
354f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
35500 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
35510 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
35520 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35530 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
35540 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
35550 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35560 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
35570 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
35580 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
35590 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
355a0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
355b0 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61  number in the da
355c0 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20  tabase. So move 
355d0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64 6f  the page that do
355e0 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  es into the .   
355f0 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74       ** gap left
35600 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 20   by the deleted 
35610 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20  root-page..     
35620 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65     */.        Me
35630 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20  mPage *pMove;.  
35640 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
35650 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
35660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
35670 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
35680 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
35690 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
356a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
356b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
356c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
356d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
356e0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
356f0 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41  Bt, pMove, PTRMA
35700 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69  P_ROOTPAGE, 0, i
35710 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
35720 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35730 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
35740 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
35760 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
35770 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
35780 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
35790 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  age(pBt, maxRoot
357a0 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29  Pgno, &pMove, 0)
357b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
357c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
357d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
357e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
357f0 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
35800 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
35810 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35820 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
35830 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35840 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
35850 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
35860 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d    }.        *piM
35870 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67  oved = maxRootPg
35880 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
35890 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65     /* Set the ne
358a0 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65  w 'max-root-page
358b0 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64  ' value in the d
358c0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20  atabase header. 
358d0 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73  This.      ** is
358e0 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c   the old value l
358f0 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e  ess one, less on
35900 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68  e more if that h
35910 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20  appens to.      
35920 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67  ** be a root-pag
35930 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f  e number, less o
35940 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74  ne again if that
35950 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   is the.      **
35960 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
35970 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  GE..      */.   
35980 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
35990 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52  ;.      if( maxR
359a0 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47  ootPgno==PENDING
359b0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
359c0 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
359d0 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
359e0 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52  }.      if( maxR
359f0 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f  ootPgno==PTRMAP_
35a00 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52  PAGENO(pBt, maxR
35a10 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20  ootPgno) ){.    
35a20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
35a30 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
35a40 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74   assert( maxRoot
35a50 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
35a60 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
35a70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
35a80 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
35a90 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74  ta(p, 4, maxRoot
35aa0 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Pgno);.    }else
35ab0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
35ac0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
35ad0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35ae0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  pPage);.    }.#e
35af0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
35b00 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42    /* If sqlite3B
35b10 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61  treeDropTable wa
35b20 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  s called on page
35b30 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50   1. */.    zeroP
35b40 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49  age(pPage, PTF_I
35b50 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29  NTKEY|PTF_LEAF )
35b60 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
35b70 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
35b80 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69  return rc;  .}.i
35b90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
35ba0 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ropTable(Btree *
35bb0 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
35bc0 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
35bd0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
35be0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
35bf0 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70    p->pBt->db = p
35c00 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72  ->db;.  rc = btr
35c10 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69  eeDropTable(p, i
35c20 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b  Table, piMoved);
35c30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
35c40 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
35c50 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
35c60 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e  Read the meta-in
35c70 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66  formation out of
35c80 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
35c90 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
35ca0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
35cb0 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e  ree pages curren
35cc0 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  tly in the datab
35cd0 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a  ase.  Meta[1].**
35ce0 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35   through meta[15
35cf0 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  ] are available 
35d00 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65  for use by highe
35d10 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b  r layers.  Meta[
35d20 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e  0].** is read-on
35d30 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61  ly, the others a
35d40 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a  re read/write..*
35d50 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  * .** The schema
35d60 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d   layer numbers m
35d70 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65  eta values diffe
35d80 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20  rently.  At the 
35d90 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20  schema.** layer 
35da0 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b  (and the SetCook
35db0 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69  ie and ReadCooki
35dc0 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e  e opcodes) the n
35dd0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65  umber of.** free
35de0 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69   pages is not vi
35df0 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69  sible.  So Cooki
35e00 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65  e[0] is the same
35e10 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a   as Meta[1]..*/.
35e20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
35e30 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70  GetMeta(Btree *p
35e40 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a  , int idx, u32 *
35e50 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65  pMeta){.  DbPage
35e60 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20   *pDbPage = 0;. 
35e70 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
35e80 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
35e90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
35ea0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
35eb0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
35ec0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
35ed0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69  >db;..  /* Readi
35ee0 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76  ng a meta-data v
35ef0 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61 20  alue requires a 
35f00 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
35f10 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20  e 1 (and hence. 
35f20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   ** the sqlite_m
35f30 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20  aster table. We 
35f40 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72  grab this lock r
35f50 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
35f60 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74  ther or.  ** not
35f70 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64   the SQLITE_Read
35f80 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
35f90 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61 62   is set (the tab
35fa0 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
35fb0 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61  e.  ** 1 is trea
35fc0 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c  ted as a special
35fd0 20 63 61 73 65 20 62 79 20 71 75 65 72 79 53 68   case by querySh
35fe0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
35ff0 63 6b 28 29 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ck().  ** and se
36000 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
36010 65 4c 6f 63 6b 28 29 29 2e 0a 20 20 2a 2f 0a 20  eLock())..  */. 
36020 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
36030 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
36040 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
36050 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
36060 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
36070 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
36080 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
36090 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
360a0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d   idx>=0 && idx<=
360b0 31 35 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  15 );.  if( pBt-
360c0 3e 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 2f  >pPage1 ){.    /
360d0 2a 20 54 68 65 20 62 2d 74 72 65 65 20 69 73 20  * The b-tree is 
360e0 61 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e 67 20  already holding 
360f0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
36100 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
36110 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
36120 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
36130 74 68 65 20 72 65 71 75 69 72 65 64 20 6d 65 74  the required met
36140 61 2d 64 61 74 61 20 76 61 6c 75 65 20 63 61 6e  a-data value can
36150 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
36160 79 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  y.    ** from th
36170 65 20 70 61 67 65 20 64 61 74 61 20 6f 66 20 74  e page data of t
36180 68 69 73 20 72 65 66 65 72 65 6e 63 65 2e 20 54  his reference. T
36190 68 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79 20  his is slightly 
361a0 66 61 73 74 65 72 20 74 68 61 6e 0a 20 20 20 20  faster than.    
361b0 2a 2a 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  ** requesting a 
361c0 6e 65 77 20 72 65 66 65 72 65 6e 63 65 20 66 72  new reference fr
361d0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
361e0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  er..    */.    p
361f0 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  P1 = (unsigned c
36200 68 61 72 20 2a 29 70 42 74 2d 3e 70 50 61 67 65  har *)pBt->pPage
36210 31 2d 3e 61 44 61 74 61 3b 0a 20 20 7d 65 6c 73  1->aData;.  }els
36220 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d  e{.    /* The b-
36230 74 72 65 65 20 64 6f 65 73 20 6e 6f 74 20 68 61  tree does not ha
36240 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ve a reference t
36250 6f 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  o page 1 of the 
36260 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
36270 20 20 20 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e 65     ** Obtain one
36280 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
36290 6c 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  layer..    */.  
362a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
362b0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
362c0 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29  er, 1, &pDbPage)
362d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
362e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
362f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
36300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36310 20 7d 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e   }.    pP1 = (un
36320 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71  signed char *)sq
36330 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
36340 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  a(pDbPage);.  }.
36350 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62    *pMeta = get4b
36360 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
36370 78 2a 34 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  x*4]);..  /* If 
36380 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6e 6f  the b-tree is no
36390 74 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  t holding a refe
363a0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 2c  rence to page 1,
363b0 20 74 68 65 6e 20 6f 6e 65 20 77 61 73 20 0a 20   then one was . 
363c0 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72   ** requested fr
363d0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
363e0 65 72 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  er in the above 
363f0 62 6c 6f 63 6b 2e 20 52 65 6c 65 61 73 65 20 69  block. Release i
36400 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  t now..  */.  if
36410 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 29  ( !pBt->pPage1 )
36420 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
36430 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
36440 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
36450 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64  utovacuumed is d
36460 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20  isabled in this 
36470 62 75 69 6c 64 20 62 75 74 20 77 65 20 61 72 65  build but we are
36480 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a   trying to .  **
36490 20 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76   access an autov
364a0 61 63 75 75 6d 65 64 20 64 61 74 61 62 61 73 65  acuumed database
364b0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20  , then make the 
364c0 64 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c  database readonl
364d0 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  y. .  */.#ifdef 
364e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
364f0 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78  VACUUM.  if( idx
36500 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20  ==4 && *pMeta>0 
36510 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ) pBt->readOnly 
36520 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  = 1;.#endif..  /
36530 2a 20 47 72 61 62 20 74 68 65 20 72 65 61 64 2d  * Grab the read-
36540 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20  lock on page 1. 
36550 2a 2f 0a 20 20 72 63 20 3d 20 73 65 74 53 68 61  */.  rc = setSha
36560 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
36570 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43  k(p, 1, READ_LOC
36580 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K);.  sqlite3Btr
36590 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
365a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
365b0 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66  * Write meta-inf
365c0 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e  ormation back in
365d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
365e0 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20    Meta[0] is.** 
365f0 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61  read-only and ma
36600 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  y not be written
36610 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36620 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
36630 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64  Btree *p, int id
36640 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a 20  x, u32 iMeta){. 
36650 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
36660 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
36670 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
36680 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
36690 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78  t( idx>=1 && idx
366a0 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  <=15 );.  sqlite
366b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
366c0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
366d0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
366e0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
366f0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
36700 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  ( pBt->pPage1!=0
36710 20 29 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d   );.  pP1 = pBt-
36720 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a  >pPage1->aData;.
36730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36740 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
36750 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
36760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36770 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 75 74 34 62  _OK ){.    put4b
36780 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
36790 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69  x*4], iMeta);.#i
367a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
367b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
367c0 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20   if( idx==7 ){. 
367d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
367e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20  ->autoVacuum || 
367f0 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  iMeta==0 );.    
36800 20 20 61 73 73 65 72 74 28 20 69 4d 65 74 61 3d    assert( iMeta=
36810 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29  =0 || iMeta==1 )
36820 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
36830 72 56 61 63 75 75 6d 20 3d 20 28 75 38 29 69 4d  rVacuum = (u8)iM
36840 65 74 61 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eta;.    }.#endi
36850 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  f.  }.  sqlite3B
36860 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
36870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36880 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
36890 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20  lag byte at the 
368a0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
368b0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63   page that the c
368c0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72  ursor.** is curr
368d0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
368e0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
368f0 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75  3BtreeFlags(BtCu
36900 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
36910 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f  * TODO: What abo
36920 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  ut CURSOR_REQUIR
36930 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f  ESEEK state? Pro
36940 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61  bably need to ca
36950 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 43  ll.  ** restoreC
36960 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
36970 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d  here..  */.  Mem
36980 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72  Page *pPage;.  r
36990 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
369a0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50  tion(pCur);.  pP
369b0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
369c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
369d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
369e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
369f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36a00 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
36a10 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 3d  ert( pPage->pBt=
36a20 3d 70 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20  =pCur->pBt );.  
36a30 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 44  return pPage->aD
36a40 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
36a50 66 73 65 74 5d 3b 0a 7d 0a 0a 23 69 66 6e 64 65  fset];.}..#ifnde
36a60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
36a70 52 45 45 43 4f 55 4e 54 0a 2f 2a 0a 2a 2a 20 54  REECOUNT./*.** T
36a80 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
36a90 74 2c 20 70 43 75 72 2c 20 69 73 20 61 20 63 75  t, pCur, is a cu
36aa0 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 73  rsor opened on s
36ab0 6f 6d 65 20 62 2d 74 72 65 65 2e 20 43 6f 75 6e  ome b-tree. Coun
36ac0 74 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  t the.** number 
36ad0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
36ae0 65 20 62 2d 74 72 65 65 20 61 6e 64 20 77 72 69  e b-tree and wri
36af0 74 65 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f  te the result to
36b00 20 2a 70 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a   *pnEntry..**.**
36b10 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
36b20 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6f 70  turned if the op
36b30 65 72 61 74 69 6f 6e 20 69 73 20 73 75 63 63 65  eration is succe
36b40 73 73 66 75 6c 6c 79 20 65 78 65 63 75 74 65 64  ssfully executed
36b50 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
36b60 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
36b70 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 69 2e 65  encountered (i.e
36b80 2e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 72  . an IO error or
36b90 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72   database.** cor
36ba0 72 75 70 74 69 6f 6e 29 20 61 6e 20 53 51 4c 69  ruption) an SQLi
36bb0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
36bc0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
36bd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
36be0 75 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  unt(BtCursor *pC
36bf0 75 72 2c 20 69 36 34 20 2a 70 6e 45 6e 74 72 79  ur, i64 *pnEntry
36c00 29 7b 0a 20 20 69 36 34 20 6e 45 6e 74 72 79 20  ){.  i64 nEntry 
36c10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
36c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
36c30 75 65 20 74 6f 20 72 65 74 75 72 6e 20 69 6e 20  ue to return in 
36c40 2a 70 6e 45 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  *pnEntry */.  in
36c50 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
36c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
36c80 65 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 6f 76 65  e */.  rc = move
36c90 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 0a 20  ToRoot(pCur);.. 
36ca0 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72   /* Unless an er
36cb0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
36cc0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
36cd0 75 6e 73 20 6f 6e 65 20 69 74 65 72 61 74 69 6f  uns one iteratio
36ce0 6e 20 66 6f 72 20 65 61 63 68 0a 20 20 2a 2a 20  n for each.  ** 
36cf0 70 61 67 65 20 69 6e 20 74 68 65 20 42 2d 54 72  page in the B-Tr
36d00 65 65 20 73 74 72 75 63 74 75 72 65 20 28 6e 6f  ee structure (no
36d10 74 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72  t including over
36d20 66 6c 6f 77 20 70 61 67 65 73 29 2e 20 0a 20 20  flow pages). .  
36d30 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  */.  while( rc==
36d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36d50 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20   int iIdx;      
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d70 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
36d80 63 68 69 6c 64 20 6e 6f 64 65 20 69 6e 20 70 61  child node in pa
36d90 72 65 6e 74 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  rent */.    MemP
36da0 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
36db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36dc0 2a 20 43 75 72 72 65 6e 74 20 70 61 67 65 20 6f  * Current page o
36dd0 66 20 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a  f the b-tree */.
36de0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
36df0 69 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  is a leaf page o
36e00 72 20 74 68 65 20 74 72 65 65 20 69 73 20 6e 6f  r the tree is no
36e10 74 20 61 6e 20 69 6e 74 2d 6b 65 79 20 74 72 65  t an int-key tre
36e20 65 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  e, then .    ** 
36e30 74 68 69 73 20 70 61 67 65 20 63 6f 6e 74 61 69  this page contai
36e40 6e 73 20 63 6f 75 6e 74 61 62 6c 65 20 65 6e 74  ns countable ent
36e50 72 69 65 73 2e 20 49 6e 63 72 65 6d 65 6e 74 20  ries. Increment 
36e60 74 68 65 20 65 6e 74 72 79 20 63 6f 75 6e 74 65  the entry counte
36e70 72 0a 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69  r.    ** accordi
36e80 6e 67 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ngly..    */.   
36e90 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
36ea0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
36eb0 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
36ec0 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
36ed0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
36ee0 20 20 20 6e 45 6e 74 72 79 20 2b 3d 20 70 50 61     nEntry += pPa
36ef0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 7d  ge->nCell;.    }
36f00 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 20 69  ..    /* pPage i
36f10 73 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 54  s a leaf node. T
36f20 68 69 73 20 6c 6f 6f 70 20 6e 61 76 69 67 61 74  his loop navigat
36f30 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  es the cursor so
36f40 20 74 68 61 74 20 69 74 20 0a 20 20 20 20 2a 2a   that it .    **
36f50 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
36f60 69 72 73 74 20 69 6e 74 65 72 69 6f 72 20 63 65  irst interior ce
36f70 6c 6c 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ll that it point
36f80 73 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  s to the parent 
36f90 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  of.    ** the ne
36fa0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  xt page in the t
36fb0 72 65 65 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ree that has not
36fc0 20 79 65 74 20 62 65 65 6e 20 76 69 73 69 74 65   yet been visite
36fd0 64 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 43  d. The.    ** pC
36fe0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
36ff0 69 50 61 67 65 5d 20 76 61 6c 75 65 20 69 73 20  iPage] value is 
37000 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
37010 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63   of the parent c
37020 65 6c 6c 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ell.    ** of th
37030 65 20 70 61 67 65 2c 20 6f 72 20 74 6f 20 74 68  e page, or to th
37040 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
37050 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  s in the page if
37060 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 0a 20   the next page. 
37070 20 20 20 2a 2a 20 74 6f 20 76 69 73 69 74 20 69     ** to visit i
37080 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
37090 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
370a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
370b0 66 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74  f all pages in t
370c0 68 65 20 74 72 65 65 20 68 61 76 65 20 62 65 65  he tree have bee
370d0 6e 20 76 69 73 69 74 65 64 2c 20 72 65 74 75 72  n visited, retur
370e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 74 6f 20 74  n SQLITE_OK to t
370f0 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  he.    ** caller
37100 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
37110 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
37120 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
37130 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
37140 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
37150 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20     /* All pages 
37160 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 68 61  of the b-tree ha
37170 76 65 20 62 65 65 6e 20 76 69 73 69 74 65 64 2e  ve been visited.
37180 20 52 65 74 75 72 6e 20 73 75 63 63 65 73 73 66   Return successf
37190 75 6c 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ully. */.       
371a0 20 20 20 2a 70 6e 45 6e 74 72 79 20 3d 20 6e 45     *pnEntry = nE
371b0 6e 74 72 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ntry;.          
371c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
371d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
371e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
371f0 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  MoveToParent(pCu
37200 72 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  r);.      }while
37210 20 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ( pCur->aiIdx[p
37220 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75  Cur->iPage]>=pCu
37230 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
37240 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
37250 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  ..      pCur->ai
37260 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
37270 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  ++;.      pPage 
37280 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
37290 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
372a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 73 63 65   }..    /* Desce
372b0 6e 64 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  nd to the child 
372c0 6e 6f 64 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  node of the cell
372d0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
372e0 20 63 75 72 72 65 6e 74 6c 79 20 0a 20 20 20 20   currently .    
372f0 2a 2a 20 70 6f 69 6e 74 73 20 61 74 2e 20 54 68  ** points at. Th
37300 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  is is the right-
37310 63 68 69 6c 64 20 69 66 20 28 69 49 64 78 3d 3d  child if (iIdx==
37320 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 2e 0a 20  pPage->nCell).. 
37330 20 20 20 2a 2f 0a 20 20 20 20 69 49 64 78 20 3d     */.    iIdx =
37340 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
37350 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
37360 66 28 20 69 49 64 78 3d 3d 70 50 61 67 65 2d 3e  f( iIdx==pPage->
37370 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  nCell ){.      r
37380 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
37390 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
373a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
373b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
373c0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
373d0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
373e0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
373f0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
37400 61 67 65 2c 20 69 49 64 78 29 29 29 3b 0a 20 20  age, iIdx)));.  
37410 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e    }.  }..  /* An
37420 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
37430 72 65 64 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  red. Return an e
37440 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20  rror code. */.  
37450 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
37460 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
37470 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f  n the pager asso
37480 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54  ciated with a BT
37490 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ree.  This routi
374a0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  ne is used for.*
374b0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
374c0 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
374d0 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42  .Pager *sqlite3B
374e0 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20  treePager(Btree 
374f0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
37500 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a  >pBt->pPager;.}.
37510 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37520 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
37530 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  HECK./*.** Appen
37540 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74  d a message to t
37550 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
37560 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
37570 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70  ic void checkApp
37580 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72  endMsg(.  Integr
37590 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20  ityCk *pCheck,. 
375a0 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20   char *zMsg1,.  
375b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
375c0 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20  mat,.  ....){.  
375d0 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
375e0 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  ( !pCheck->mxErr
375f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68   ) return;.  pCh
37600 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20  eck->mxErr--;.  
37610 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a  pCheck->nErr++;.
37620 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
37630 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 70  Format);.  if( p
37640 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43  Check->errMsg.nC
37650 68 61 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  har ){.    sqlit
37660 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
37670 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  (&pCheck->errMsg
37680 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a  , "\n", 1);.  }.
37690 20 20 69 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20    if( zMsg1 ){. 
376a0 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
376b0 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b  umAppend(&pCheck
376c0 2d 3e 65 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c  ->errMsg, zMsg1,
376d0 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   -1);.  }.  sqli
376e0 74 65 33 56 58 50 72 69 6e 74 66 28 26 70 43 68  te3VXPrintf(&pCh
376f0 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20  eck->errMsg, 1, 
37700 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
37710 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
37720 28 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  ( pCheck->errMsg
37730 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  .mallocFailed ){
37740 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c  .    pCheck->mal
37750 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
37760 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
37770 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
37780 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
37790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
377a0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
377b0 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74  CK./*.** Add 1 t
377c0 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  o the reference 
377d0 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69  count for page i
377e0 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69  Page.  If this i
377f0 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
37800 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
37810 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72   page, add an er
37820 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70  ror message to p
37830 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Check->zErrMsg..
37840 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
37850 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d  here are 2 ore m
37860 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ore references t
37870 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30  o the page and 0
37880 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69   if.** if this i
37890 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65  s the first refe
378a0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
378b0 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68  e..**.** Also ch
378c0 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
378d0 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62  e number is in b
378e0 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ounds..*/.static
378f0 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e   int checkRef(In
37900 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
37910 6b 2c 20 50 67 6e 6f 20 69 50 61 67 65 2c 20 63  k, Pgno iPage, c
37920 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a  har *zContext){.
37930 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
37940 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
37950 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e   iPage>pCheck->n
37960 50 61 67 65 20 29 7b 0a 20 20 20 20 63 68 65 63  Page ){.    chec
37970 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
37980 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e  k, zContext, "in
37990 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65  valid page numbe
379a0 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  r %d", iPage);. 
379b0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
379c0 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61  .  if( pCheck->a
379d0 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29  nRef[iPage]==1 )
379e0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
379f0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
37a00 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65  ntext, "2nd refe
37a10 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64  rence to page %d
37a20 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72  ", iPage);.    r
37a30 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
37a40 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e  eturn  (pCheck->
37a50 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e  anRef[iPage]++)>
37a60 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
37a70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
37a80 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  CUUM./*.** Check
37a90 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
37aa0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
37ab0 61 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69  ap for page iChi
37ac0 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70  ld maps to .** p
37ad0 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69  age iParent, poi
37ae0 6e 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70  nter type ptrTyp
37af0 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e  e. If not, appen
37b00 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
37b10 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e  ge.** to pCheck.
37b20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
37b30 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49  checkPtrmap(.  I
37b40 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
37b50 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69  ck,   /* Integri
37b60 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74  ty check context
37b70 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
37b80 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
37b90 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65  Child page numbe
37ba0 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  r */.  u8 eType,
37bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37bc0 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65   Expected pointe
37bd0 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20  r map type */.  
37be0 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20  Pgno iParent,   
37bf0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
37c00 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  ed pointer map p
37c10 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
37c20 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  r */.  char *zCo
37c30 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a  ntext         /*
37c40 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70   Context descrip
37c50 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65  tion (used for e
37c60 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a  rror msg) */.){.
37c70 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65    int rc;.  u8 e
37c80 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67  PtrmapType;.  Pg
37c90 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  no iPtrmapParent
37ca0 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70  ;..  rc = ptrmap
37cb0 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c  Get(pCheck->pBt,
37cc0 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61   iChild, &ePtrma
37cd0 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50  pType, &iPtrmapP
37ce0 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
37cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37d00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37d10 45 5f 4e 4f 4d 45 4d 20 29 20 70 43 68 65 63 6b  E_NOMEM ) pCheck
37d20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
37d30 20 31 3b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   1;.    checkApp
37d40 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
37d50 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64  Context, "Failed
37d60 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20   to read ptrmap 
37d70 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29  key=%d", iChild)
37d80 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
37d90 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70  }..  if( ePtrmap
37da0 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69  Type!=eType || i
37db0 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50  PtrmapParent!=iP
37dc0 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65  arent ){.    che
37dd0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
37de0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  ck, zContext, . 
37df0 20 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61       "Bad ptr ma
37e00 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65  p entry key=%d e
37e10 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20  xpected=(%d,%d) 
37e20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20  got=(%d,%d)", . 
37e30 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79       iChild, eTy
37e40 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74  pe, iParent, ePt
37e50 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61  rmapType, iPtrma
37e60 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  pParent);.  }.}.
37e70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
37e80 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
37e90 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  y of the freelis
37ea0 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  t or of an overf
37eb0 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  low page list..*
37ec0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
37ed0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
37ee0 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73  s on the list is
37ef0 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   N..*/.static vo
37f00 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20  id checkList(.  
37f10 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
37f20 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69  eck,  /* Integri
37f30 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74  ty checking cont
37f40 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46  ext */.  int isF
37f50 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  reeList,       /
37f60 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66 72 65  * True for a fre
37f70 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f  elist.  False fo
37f80 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  r overflow page 
37f90 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  list */.  int iP
37fa0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
37fb0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
37fc0 6f 72 20 66 69 72 73 74 20 70 61 67 65 20 69 6e  or first page in
37fd0 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
37fe0 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
37ff0 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
38000 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
38010 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
38020 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
38030 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
38040 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
38050 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sages */.){.  in
38060 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63  t i;.  int expec
38070 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69  ted = N;.  int i
38080 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20  First = iPage;. 
38090 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20   while( N-- > 0 
380a0 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
380b0 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a   ){.    DbPage *
380c0 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75  pOvflPage;.    u
380d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f  nsigned char *pO
380e0 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28  vflData;.    if(
380f0 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20   iPage<1 ){.    
38100 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
38110 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
38120 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64 20  t,.         "%d 
38130 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69 73 73  of %d pages miss
38140 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f  ing from overflo
38150 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  w list starting 
38160 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  at %d",.        
38170 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c    N+1, expected,
38180 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20   iFirst);.      
38190 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
381a0 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43   if( checkRef(pC
381b0 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f  heck, iPage, zCo
381c0 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a  ntext) ) break;.
381d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
381e0 61 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e  agerGet(pCheck->
381f0 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50  pPager, (Pgno)iP
38200 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29  age, &pOvflPage)
38210 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
38220 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
38230 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c   zContext, "fail
38240 65 64 20 74 6f 20 67 65 74 20 70 61 67 65 20 25  ed to get page %
38250 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
38260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
38270 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28     pOvflData = (
38280 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
38290 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
382a0 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a  ata(pOvflPage);.
382b0 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c 69      if( isFreeLi
382c0 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
382d0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  n = get4byte(&pO
382e0 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66  vflData[4]);.#if
382f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
38300 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
38310 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
38320 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
38330 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
38340 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61  rmap(pCheck, iPa
38350 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
38360 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74  AGE, 0, zContext
38370 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
38380 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43  f.      if( n>pC
38390 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  heck->pBt->usabl
383a0 65 53 69 7a 65 2f 34 2d 32 20 29 7b 0a 20 20 20  eSize/4-2 ){.   
383b0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
383c0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
383d0 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20  text,.          
383e0 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20   "freelist leaf 
383f0 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e  count too big on
38400 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
38410 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a  );.        N--;.
38420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
38430 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
38440 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
38450 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67     Pgno iFreePag
38460 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  e = get4byte(&pO
38470 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b