/ Hex Artifact Content
Login

Artifact dcf8157bd4b28a6125d2900f3031a034c1f57720:


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 37 20 32 30 30 39 2f 30  c,v 1.587 2009/0
0190: 34 2f 30 31 20 31 39 3a 30 37 3a 30 34 20 64 61  4/01 19:07:04 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 61  t->mutex) );.  a
ecf0: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
ed00: 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
ed10: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
ed20: 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
ed30: 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
ed40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ed50: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
ed60: 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
ed70: 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
ed80: 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
ed90: 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
eda0: 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
edb0: 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
edc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
edd0: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
ede0: 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
edf0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
ee00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
ee10: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
ee20: 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  led;.  }else if(
ee30: 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
ee40: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  int pageSize;.  
ee50: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
ee60: 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
ee70: 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
ee80: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
ee90: 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28  _NOTADB;.    if(
eea0: 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
eeb0: 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
eec0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
eed0: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
eee0: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
eef0: 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
ef00: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61  {.      pBt->rea
ef10: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dOnly = 1;.    }
ef20: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
ef30: 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
ef40: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
ef50: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
ef60: 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
ef70: 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
ef80: 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  n must be exactl
ef90: 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20  y 25%.  And the 
efa0: 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65  minimum.    ** e
efb0: 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
efc0: 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66   must be 12.5% f
efd0: 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74  or both leaf-dat
efe0: 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64  a and non-leaf-d
eff0: 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ata..    ** The 
f000: 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
f010: 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
f020: 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
f030: 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
f040: 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
f050: 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
f060: 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
f070: 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
f080: 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
f090: 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
f0a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
f0b0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
f0c0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ed;.    }.    pa
f0d0: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
f0e0: 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20  e(&page1[16]);. 
f0f0: 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
f100: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
f110: 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31  0 || pageSize<51
f120: 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51  2 ||.        (SQ
f130: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
f140: 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67 65  ZE<32768 && page
f150: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
f160: 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29  PAGE_SIZE).    )
f170: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
f180: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
f190: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
f1a0: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
f1b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
f1c0: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
f1d0: 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
f1e0: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d    if( pageSize!=
f1f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
f200: 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
f210: 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
f220: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
f230: 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
f240: 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
f250: 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
f260: 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
f270: 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
f280: 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
f290: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
f2a0: 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
f2b0: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
f2c0: 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
f2d0: 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
f2e0: 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
f2f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
f300: 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
f310: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
f320: 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
f330: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
f340: 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
f350: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
f360: 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
f370: 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
f380: 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61  eSize = (u16)usa
f390: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
f3a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
f3b0: 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
f3c0: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
f3d0: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71  e(pBt);.      sq
f3e0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
f3f0: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
f400: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
f410: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
f420: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
f430: 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  }.    if( usable
f440: 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20  Size<500 ){.    
f450: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
f460: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
f470: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
f480: 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
f490: 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
f4a0: 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73  leSize = (u16)us
f4b0: 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
f4c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f4d0: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
f4e0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
f4f0: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
f500: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
f510: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
f520: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
f530: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
f540: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
f550: 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
f560: 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
f570: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
f580: 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
f590: 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
f5a0: 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
f5b0: 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
f5c0: 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
f5d0: 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
f5e0: 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
f5f0: 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
f600: 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
f610: 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
f620: 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
f630: 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
f640: 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
f650: 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
f660: 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
f670: 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
f680: 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
f690: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
f6a0: 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
f6b0: 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
f6c0: 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
f6d0: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
f6e0: 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
f6f0: 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
f700: 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
f710: 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
f720: 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
f730: 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
f740: 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
f750: 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
f760: 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
f770: 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
f780: 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
f790: 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
f7a0: 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
f7b0: 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
f7c0: 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
f7d0: 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e  - 23;.  pBt->min
f7e0: 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
f7f0: 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
f800: 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
f810: 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e  >maxLeaf = pBt->
f820: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b  usableSize - 35;
f830: 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20  .  pBt->minLeaf 
f840: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
f850: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
f860: 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  23;.  assert( pB
f870: 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
f880: 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
f890: 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
f8a0: 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
f8b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f8c0: 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
f8d0: 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
f8e0: 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
f8f0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
f900: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f910: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
f920: 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
f930: 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65  lockBtree() exce
f940: 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20  pt that it also 
f950: 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62  invokes the.** b
f960: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
f970: 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f  there is lock co
f980: 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ntention..*/.sta
f990: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
f9a0: 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65  eWithRetry(Btree
f9b0: 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72   *pRef){.  int r
f9c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
f9d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f9e0: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
f9f0: 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20  (pRef) );.  if( 
fa00: 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  pRef->inTrans==T
fa10: 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
fa20: 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f   u8 inTransactio
fa30: 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69  n = pRef->pBt->i
fa40: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
fa50: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
fa60: 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d  (pRef);.    rc =
fa70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
fa80: 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29  inTrans(pRef, 0)
fa90: 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d  ;.    pRef->pBt-
faa0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
fab0: 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a   inTransaction;.
fac0: 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e      pRef->inTran
fad0: 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
fae0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
faf0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
fb00: 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73  Ref->pBt->nTrans
fb10: 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a  action--;.    }.
fb20: 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
fb30: 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20  ty(pRef);.  }.  
fb40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20  return rc;.}.   
fb50: 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74      ../*.** If t
fb60: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
fb70: 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
fb80: 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
fb90: 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
fba0: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
fbb0: 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
fbc0: 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
fbd0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
fbe0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
fbf0: 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
fc00: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
fc10: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
fc20: 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
fc30: 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
fc40: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
fc50: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
fc60: 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  re any outstandi
fc70: 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73  ng cursors, this
fc80: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
fc90: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
fca0: 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
fcb0: 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
fcc0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
fcd0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
fce0: 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
fcf0: 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
fd00: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
fd10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fd20: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
fd30: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
fd40: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
fd50: 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
fd60: 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  & pBt->pCursor==
fd70: 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  0 && pBt->pPage1
fd80: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  !=0 ){.    if( s
fd90: 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
fda0: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
fdb0: 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73  >=1 ){.      ass
fdc0: 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
fdd0: 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69 66 20 30  ->aData );.#if 0
fde0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
fdf0: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30  pPage1->aData==0
fe00: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
fe10: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74  age *pPage = pBt
fe20: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20  ->pPage1;.      
fe30: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
fe40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
fe50: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
fe60: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50  age);.        pP
fe70: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
fe80: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
fe90: 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  gno = 1;.      }
fea0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
feb0: 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70  leasePage(pBt->p
fec0: 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
fed0: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
fee0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
fef0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
ff00: 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
ff10: 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
ff20: 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
ff30: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
ff40: 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
ff50: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
ff60: 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
ff70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ff80: 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
ff90: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
ffa0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
ffb0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
ffc0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
ffd0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
ffe0: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
fff0: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
10000 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10010 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20   || nPage>0 ){. 
10020 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10030 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
10040 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
10050 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
10060 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
10070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10080 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
10090 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
100a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
100b0 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
100c0 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
100d0 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
100e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
100f0 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
10100 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79  ==16 );.  put2by
10110 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42  te(&data[16], pB
10120 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
10130 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
10140 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
10150 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
10160 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
10170 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
10180 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
10190 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
101a0 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
101b0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
101c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
101d0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
101e0 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
101f0 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
10200 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
10210 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
10220 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
10230 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
10240 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
10250 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
10260 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
10270 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
10280 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
10290 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
102a0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
102b0 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
102c0 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
102d0 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
102e0 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
102f0 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
10300 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
10310 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
10320 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
10330 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
10340 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
10350 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
10360 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
10370 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
10380 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
10390 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
103a0 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
103b0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
103c0 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
103d0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
103e0 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
103f0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
10400 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
10410 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10420 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
10430 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
10440 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
10450 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
10460 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
10470 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
10480 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
10490 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
104a0 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
104b0 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
104c0 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
104d0 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
104e0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
104f0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
10500 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
10510 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
10520 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
10530 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
10540 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
10550 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
10560 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
10570 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
10580 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
10590 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
105a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
105b0 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
105c0 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
105d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
105e0 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
105f0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
10600 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
10610 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
10620 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
10630 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
10640 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
10650 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
10660 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
10670 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
10680 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
10690 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
106a0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
106b0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
106c0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
106d0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
106e0 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
106f0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
10700 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
10710 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
10720 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
10730 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
10740 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
10750 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
10760 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
10770 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
10780 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
10790 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
107a0 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
107b0 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
107c0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
107d0 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
107e0 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
107f0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
10800 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
10810 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
10820 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
10830 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
10840 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
10850 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
10860 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
10870 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
10880 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
10890 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
108a0 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
108b0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
108c0 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
108d0 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
108e0 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
108f0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
10900 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
10910 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
10920 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
10930 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
10940 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
10950 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
10960 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
10970 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
10980 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
10990 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
109a0 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
109b0 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
109c0 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
109d0 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
109e0 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
109f0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
10a00 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
10a10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
10a20 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
10a30 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
10a40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
10a50 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
10a60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10a70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
10a80 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
10a90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10aa0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
10ab0 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74  ->db;.  btreeInt
10ac0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
10ad0 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
10ae0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
10af0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
10b00 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
10b10 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
10b20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
10b30 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
10b40 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
10b50 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
10b60 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
10b70 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
10b80 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
10b90 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
10ba0 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
10bb0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
10bc0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
10bd0 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
10be0 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
10bf0 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
10c00 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
10c10 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
10c20 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
10c30 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
10c40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
10c50 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
10c60 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
10c70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
10c80 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
10c90 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
10ca0 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
10cb0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
10cc0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
10cd0 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
10ce0 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
10cf0 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
10d00 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
10d10 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
10d20 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
10d30 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
10d40 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
10d50 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
10d60 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
10d70 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73  RITE) || pBt->is
10d80 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70  Pending ){.    p
10d90 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
10da0 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
10db0 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
10dc0 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
10dd0 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
10de0 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
10df0 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
10e00 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
10e10 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
10e20 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
10e30 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
10e40 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
10e50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10e60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
10e70 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
10e80 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
10e90 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
10ea0 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
10eb0 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
10ec0 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
10ed0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
10ee0 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
10ef0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
10f00 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
10f10 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
10f20 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
10f30 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
10f40 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
10f50 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
10f60 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
10f70 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
10f80 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
10f90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
10fa0 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
10fb0 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
10fc0 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
10fd0 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
10fe0 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
10ff0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
11000 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
11010 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
11020 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
11030 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
11040 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
11050 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
11060 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
11070 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
11080 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
11090 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
110a0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
110b0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
110c0 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
110d0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
110e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
110f0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
11100 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
11110 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11120 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
11130 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11140 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11150 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
11160 74 2d 3e 70 50 61 67 65 72 2c 20 77 72 66 6c 61  t->pPager, wrfla
11170 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  g>1);.        if
11180 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
111a0 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
111b0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
111c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
111d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
111e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
111f0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
11200 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
11210 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
11220 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
11230 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
11240 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
11250 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
11260 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
11270 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
11280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11290 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
112a0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
112b0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
112c0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  saction++;.    }
112d0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
112e0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
112f0 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
11300 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
11310 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
11320 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
11330 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
11340 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
11350 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  s;.    }.#ifndef
11360 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
11370 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66  RED_CACHE.    if
11380 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
11390 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
113a0 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
113b0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
113c0 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73  p;.      pBt->is
113d0 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29  Exclusive = (u8)
113e0 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20  (wrflag>1);.    
113f0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74  }.#endif.  }...t
11400 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
11410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11420 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
11430 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
11440 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
11450 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
11460 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
11470 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
11480 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
11490 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
114a0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
114b0 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
114c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
114d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
114e0 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
114f0 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
11500 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
11510 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
11520 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
11530 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
11540 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
11550 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
11560 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
11570 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
11590 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
115a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
115b0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
115c0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
115d0 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
115e0 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
115f0 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
11600 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
11610 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
11620 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
11630 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
11640 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
11650 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
11660 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
11670 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
11680 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
11690 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
116a0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116c0 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
116d0 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
116e0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11700 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
11710 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
11720 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11740 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
11750 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
11760 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
11770 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
11780 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
11790 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
117a0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
117b0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
117c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
117d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
117e0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
117f0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
11800 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
11810 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11820 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
11830 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
11840 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
11850 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
11860 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
11870 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
11880 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
11890 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
118a0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
118b0 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
118c0 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
118d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
118e0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63        goto set_c
118f0 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
11900 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
11910 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
11920 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
11930 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
11940 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72  (pCell);.      r
11950 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
11960 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
11970 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
11980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
119a0 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
119b0 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  aps_out;.    }. 
119c0 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
119d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
119e0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
119f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
11a00 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
11a10 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
11a20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
11a30 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
11a40 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
11a50 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  o);.  }..set_chi
11a60 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
11a70 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
11a80 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
11a90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11aa0 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
11ab0 20 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73   pPage, which is
11ac0 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
11ad0 65 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20  e a btree page, 
11ae0 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a  not an overflow.
11af0 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f  ** page, is a po
11b00 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
11b10 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73  rom. Modify this
11b20 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74   pointer so that
11b30 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
11b40 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
11b50 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
11b60 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
11b70 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  ter to be modifi
11b80 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f  ed, as .** follo
11b90 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
11ba0 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
11bb0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
11bc0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
11bd0 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
11be0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
11bf0 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
11c00 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
11c10 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
11c20 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
11c30 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
11c40 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
11c50 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
11c60 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
11c70 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
11c80 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
11c90 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
11ca0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
11cb0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
11cc0 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
11cd0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
11ce0 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
11d10 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
11d20 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
11d30 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
11d40 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
11d50 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
11d60 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
11d70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11d80 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
11d90 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
11da0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11db0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
11dc0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
11dd0 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
11de0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
11df0 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
11e00 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
11e10 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
11e20 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
11e30 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
11e40 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
11e50 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
11e60 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
11e70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11e80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11e90 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
11ea0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
11eb0 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
11ec0 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
11ed0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
11ee0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
11ef0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
11f00 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
11f10 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
11f20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
11f30 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
11f40 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
11f50 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
11f60 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
11f70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
11f80 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
11f90 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
11fa0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
11fb0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71  info;.        sq
11fc0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
11fd0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
11fe0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
11ff0 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
12000 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
12010 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
12020 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
12030 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
12040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12050 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
12060 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
12070 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
12080 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12090 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
120a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
120b0 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
120c0 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
120d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
120e0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
120f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
12100 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
12110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
12120 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
12130 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
12140 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
12150 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
12160 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
12170 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
12180 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
12190 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
121a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
121b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
121c0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
121d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
121e0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
121f0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
12200 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
12210 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
12220 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
12230 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
12240 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
12250 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
12260 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
12270 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
12280 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
12290 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
122a0 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
122b0 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alid..*/.static 
122c0 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
122d0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
122e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
122f0 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
12300 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
12310 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
12320 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
12330 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
12340 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12350 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
12360 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
12370 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
12380 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
12390 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
123a0 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
123b0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
123c0 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
123d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
123e0 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
123f0 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
12400 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20  t isCommit.){.  
12410 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
12420 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
12430 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
12440 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
12450 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
12460 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
12470 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
12480 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
12490 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
124a0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
124b0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
124c0 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
124d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
124e0 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
124f0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
12500 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
12510 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
12520 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12530 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
12540 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
12550 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
12560 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
12570 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
12580 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
12590 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
125a0 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
125b0 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
125c0 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
125d0 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
125e0 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
125f0 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
12600 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
12610 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
12620 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
12630 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
12640 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
12650 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
12660 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
12670 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
12680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
126a0 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
126b0 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
126c0 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
126d0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
126e0 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
126f0 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
12700 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
12710 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
12720 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
12730 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
12740 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
12750 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
12760 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
12770 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
12780 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
12790 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
127a0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
127b0 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
127c0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
127d0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
127e0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
127f0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
12800 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
12810 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
12820 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
12830 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
12840 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
12850 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
12860 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
12870 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
12880 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
12890 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
128a0 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
128b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
128c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
128d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
128e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
128f0 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
12900 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
12910 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
12920 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
12930 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
12940 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
12950 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
12960 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20  2, iFreePage);. 
12970 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
129a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
129b0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
129c0 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
129d0 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
129e0 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
129f0 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
12a00 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
12a10 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
12a20 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
12a30 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
12a40 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
12a50 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
12a60 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
12a70 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
12a80 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
12a90 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
12aa0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
12ab0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
12ad0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
12ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12af0 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
12b00 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
12b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
12b30 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
12b40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12b50 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
12b60 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
12b70 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
12b80 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
12b90 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
12ba0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
12bb0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
12bc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12bd0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
12be0 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
12bf0 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
12c00 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
12c10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12c20 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
12c30 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
12c40 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
12c50 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
12c60 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
12c70 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
12c80 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
12c90 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
12ca0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
12cb0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
12cc0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
12cd0 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
12ce0 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  sful,.** return 
12cf0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
12d00 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
12d10 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
12d20 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20  ore no.** point 
12d30 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  in calling this 
12d40 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
12d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
12d60 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ONE..**.** More 
12d70 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73  specificly, this
12d80 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
12d90 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
12da0 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  e the .** databa
12db0 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c  se so that the l
12dc0 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
12dd0 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
12de0 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c  n use.** is no l
12df0 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
12e00 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20  .** If the nFin 
12e10 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
12e20 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65  -zero, the imple
12e30 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mentation assume
12e40 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61  s.** that the ca
12e50 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
12e60 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
12e70 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a  mStep() until.**
12e80 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
12e90 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72  TE_DONE or an er
12ea0 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46  ror, and that nF
12eb0 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  in is the.** num
12ec0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65  ber of pages the
12ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
12ee0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65  ill contain afte
12ef0 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65  r this .** proce
12f00 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a  ss is complete..
12f10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
12f20 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
12f30 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
12f40 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
12f50 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  tPg){.  Pgno nFr
12f60 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
12f70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
12f80 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
12f90 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
12fa0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12fb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12fc0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
12fd0 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
12fe0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
12ff0 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
13000 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
13010 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  t) ){.    int rc
13020 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
13030 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
13040 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
13050 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
13060 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
13070 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
13080 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e  FreeList==0 || n
13090 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a  Fin==iLastPg ){.
130a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
130b0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
130c0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
130d0 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
130e0 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
130f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
13100 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13110 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13120 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
13130 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
13140 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
13150 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
13160 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
13170 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
13180 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
13190 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69  ){.      if( nFi
131a0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
131b0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
131c0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
131d0 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
131e0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
131f0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
13200 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  nFin is non-zero
13210 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
13220 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
13230 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
13240 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
13250 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
13260 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
13270 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
13280 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
13290 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
132a0 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
132b0 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
132c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
132d0 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
132e0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
132f0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
13300 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
13310 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
13320 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
13330 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20  LastPg, 1);.    
13340 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13360 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13380 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
13390 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
133a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
133b0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
133c0 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
133d0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
133e0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
133f0 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
13400 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
13410 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
13420 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
13430 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  g;..      rc = s
13440 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
13450 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
13460 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
13470 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13490 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
134a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
134b0 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20  f nFin is zero, 
134c0 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
134d0 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
134e0 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
134f0 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
13500 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
13510 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
13520 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
13530 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
13540 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
13550 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e  er hand, if nFin
13560 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
13570 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
13580 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
13590 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
135a0 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
135b0 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
135c0 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
135d0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
135e0 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
135f0 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
13600 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
13610 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
13620 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
13630 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
13640 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20  g, &iFreePg, 0, 
13650 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
13660 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13670 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
13680 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
13690 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
136a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
136b0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
136c0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
136d0 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e      }while( nFin
136e0 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e  !=0 && iFreePg>n
136f0 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
13700 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
13710 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
13720 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13730 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73  3PagerWrite(pLas
13740 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  tPg->pDbPage);. 
13750 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
13760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13770 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
13780 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
13790 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
137a0 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e  e, iFreePg, nFin
137b0 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
137c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
137d0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
137e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
137f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
13800 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
13810 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
13820 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
13830 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77  iLastPg--;.    w
13840 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
13850 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
13860 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53  (pBt)||PTRMAP_IS
13870 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
13880 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
13890 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
138a0 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20  t, iLastPg) ){. 
138b0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
138c0 70 50 67 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  pPg;.        int
138d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
138e0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
138f0 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29  LastPg, &pPg, 0)
13900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13910 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13920 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13930 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
13940 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13950 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
13960 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
13970 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13980 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pPg);.        if
13990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
139a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
139b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
139c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
139d0 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
139e0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
139f0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
13a00 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73  Bt->pPager, iLas
13a10 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  tPg);.  }.  retu
13a20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13a30 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
13a40 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
13a50 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
13a60 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
13a70 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
13a80 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
13a90 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
13aa0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
13ab0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
13ac0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
13ad0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
13ae0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
13af0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
13b00 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
13b10 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
13b20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
13b30 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
13b40 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
13b50 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
13b60 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
13b70 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
13b80 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
13b90 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
13ba0 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
13bb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
13bc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13bd0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
13be0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13bf0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
13c00 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  b;.  assert( pBt
13c10 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13c20 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
13c30 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
13c40 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
13c50 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
13c60 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
13c70 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
13c80 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  se{.    invalida
13c90 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
13ca0 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  he(pBt);.    rc 
13cb0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
13cc0 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72 50 61  (pBt, 0, pagerPa
13cd0 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20  gecount(pBt));. 
13ce0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
13cf0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13d00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13d10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13d20 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
13d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
13d40 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
13d50 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
13d60 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
13d70 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
13d80 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
13d90 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
13da0 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
13db0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
13dc0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
13dd0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
13de0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
13df0 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
13e00 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
13e10 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
13e20 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
13e30 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
13e40 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
13e50 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
13e60 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
13e70 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
13e80 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
13e90 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
13ea0 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
13eb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
13ec0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
13ed0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
13ee0 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
13ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
13f00 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
13f10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
13f20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13f30 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
13f40 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
13f50 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
13f60 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
13f70 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
13f80 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
13f90 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
13fa0 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Fin;.    Pgno nF
13fb0 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  ree;.    Pgno nP
13fc0 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f 20  trmap;.    Pgno 
13fd0 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73 74  iFree;.    const
13fe0 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d   int pgsz = pBt-
13ff0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 50  >pageSize;.    P
14000 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67 65  gno nOrig = page
14010 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
14020 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ..    if( PTRMAP
14030 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
14040 69 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ig) ){.      ret
14050 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14060 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
14070 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45     if( nOrig==PE
14080 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
14090 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 4f  pBt) ){.      nO
140a0 72 69 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rig--;.    }.   
140b0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
140c0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
140d0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
140e0 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
140f0 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
14100 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
14110 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35  +pgsz/5)/(pgsz/5
14120 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f  );.    nFin = nO
14130 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
14140 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e  trmap;.    if( n
14150 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
14160 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
14170 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
14180 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
14190 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
141a0 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54   }.    while( PT
141b0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
141c0 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
141d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
141e0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
141f0 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20  nFin--;.    }.. 
14200 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
14210 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
14220 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
14230 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
14240 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
14250 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
14260 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iFree);.    }.  
14270 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
14280 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
14290 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
142a0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
142b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
142c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
142d0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
142e0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
142f0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
14300 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
14310 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
14320 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
14330 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
14340 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  36], 0);.      s
14350 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
14360 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
14370 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  ager, nFin);.   
14380 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
14390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
143a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
143b0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
143c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
143d0 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74  ert( nRef==sqlit
143e0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
143f0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
14400 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
14410 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
14420 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
14430 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  UM */../*.** Thi
14440 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
14450 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
14460 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
14470 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
14480 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
14490 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
144a0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
144b0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
144c0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
144d0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
144e0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
144f0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
14500 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
14510 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
14520 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
14530 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
14540 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
14550 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
14560 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
14570 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
14580 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
14590 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
145a0 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
145b0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
145c0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
145d0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
145e0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
145f0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
14600 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
14610 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
14620 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
14630 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
14640 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
14650 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
14660 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
14670 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
14680 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
14690 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
146a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
146b0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
146c0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
146d0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
146e0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
146f0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
14700 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
14710 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
14720 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
14730 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
14740 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
14750 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
14760 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
14770 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
14780 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
14790 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
147a0 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
147b0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
147c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
147d0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
147e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
147f0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
14800 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
14810 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
14820 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
14830 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
14840 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
14850 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
14860 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
14870 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
14880 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
14890 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
148a0 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
148b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
148c0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
148d0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
148e0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
148f0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
14900 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
14910 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
14920 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
14930 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
14940 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
14950 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
14960 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
14970 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
14980 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14990 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
149a0 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
149b0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
149c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
149d0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
149e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
149f0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
14a00 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14a10 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
14a20 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
14a30 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
14a40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14a50 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
14a60 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
14a70 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
14a80 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
14a90 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
14aa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14ac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14ad0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
14ae0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14af0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
14b00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14b10 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
14b20 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
14b30 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
14b40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14b50 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
14b60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14b70 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
14b80 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
14b90 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
14ba0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14bb0 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
14bc0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
14bd0 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
14be0 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
14bf0 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
14c00 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
14c10 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
14c20 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
14c30 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
14c40 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
14c50 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
14c60 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
14c70 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68  ne did.** all th
14c80 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
14c90 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
14ca0 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
14cb0 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
14cc0 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
14cd0 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
14ce0 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
14cf0 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
14d00 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
14d10 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
14d20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
14d30 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
14d40 0a 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73 65  .** (which cause
14d50 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
14d60 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
14d70 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
14d80 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
14d90 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
14da0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
14db0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
14dc0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
14dd0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
14de0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
14df0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
14e00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14e10 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
14e20 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
14e30 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14e40 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
14e50 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14e60 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
14e70 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
14e80 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
14e90 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
14ea0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
14eb0 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
14ec0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
14ed0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
14ee0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
14ef0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
14f00 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
14f10 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
14f20 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
14f30 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
14f40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
14f50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14f60 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
14f70 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
14f80 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
14f90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14fa0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
14fb0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
14fc0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14fd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14fe0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14ff0 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
15000 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
15010 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15020 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
15030 3b 0a 20 20 7d 0a 20 20 63 6c 65 61 72 41 6c 6c  ;.  }.  clearAll
15040 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
15050 4c 6f 63 6b 73 28 70 29 3b 0a 0a 20 20 2f 2a 20  Locks(p);..  /* 
15060 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
15070 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  s any kind of tr
15080 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
15090 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72  decrement the tr
150a0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
150b0 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
150c0 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
150d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
150e0 6e 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  nt reaches 0, se
150f0 74 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65  t.  ** the share
15100 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
15110 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
15120 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
15130 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a   call below.  **
15140 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
15150 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   pager..  */.  i
15160 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
15170 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
15180 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
15190 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d  on--;.    if( 0=
151a0 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
151b0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
151c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
151d0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
151e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
151f0 20 74 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72   the handles cur
15200 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
15210 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
15220 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a  NONE and unlock.
15230 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69    ** the pager i
15240 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
15250 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
15260 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
15270 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 62 74  ction..  */.  bt
15280 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
15290 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e  nt(pBt);.  p->in
152a0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
152b0 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  NE;.  unlockBtre
152c0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
152d0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
152e0 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
152f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
15320 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
15330 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
15340 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
15350 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
15360 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
15370 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15380 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
15390 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
153a0 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
153b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
153c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
153d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
153e0 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  o(p);.  }.  sqli
153f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
15400 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15410 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
15420 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
15430 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
15440 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
15450 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
15460 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
15470 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
15480 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
15490 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
154a0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
154b0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
154c0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
154d0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
154e0 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
154f0 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
15500 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
15510 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
15520 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
15530 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
15540 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
15550 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
15560 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
15570 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
15580 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
15590 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
155a0 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
155b0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
155c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
155d0 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
155e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
155f0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
15600 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
15610 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
15620 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
15630 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
15640 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
15650 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
15660 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
15670 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
15680 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
15690 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
156a0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
156b0 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
156c0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
156d0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
156e0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
156f0 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
15700 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
15710 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
15720 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
15730 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
15740 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
15750 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
15760 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
15770 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
15780 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
15790 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
157a0 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
157b0 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
157c0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
157d0 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
157e0 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
157f0 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
15800 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
15810 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
15820 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
15830 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
15840 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
15850 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
15860 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
15870 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
15880 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
15890 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
158a0 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
158b0 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
158c0 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
158d0 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
158e0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
158f0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
15900 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
15910 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
15920 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
15930 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
15940 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
15950 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
15960 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
15970 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
15980 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
15990 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
159a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
159b0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
159c0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e  rsor(p);.    p->
159d0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
159e0 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b  FAULT;.    p->sk
159f0 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  ip = errCode;.  
15a00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
15a10 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
15a20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15a30 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
15a40 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
15a50 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
15a60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15a70 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
15a80 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
15a90 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15aa0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
15ab0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
15ac0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
15ad0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
15ae0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
15af0 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
15b00 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
15b10 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
15b20 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
15b30 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
15b40 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
15b50 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
15b60 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
15b70 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15b80 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
15b90 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
15ba0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
15bb0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
15bc0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
15bd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15be0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
15bf0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
15c00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15c10 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
15c20 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
15c30 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15c40 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
15c50 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
15c60 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
15c70 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
15c80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15c90 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
15ca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15cb0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
15cc0 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
15cd0 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
15ce0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
15cf0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
15d00 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
15d10 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
15d20 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
15d30 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
15d40 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
15d50 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
15d60 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
15d70 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
15d80 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
15d90 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
15da0 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
15db0 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
15dc0 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
15dd0 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
15de0 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
15df0 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
15e00 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
15e10 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
15e20 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
15e30 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
15e40 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
15e50 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
15e60 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
15e70 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
15e80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
15e90 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
15ea0 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  rc);.  }.#endif.
15eb0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
15ec0 28 70 29 3b 0a 20 20 63 6c 65 61 72 41 6c 6c 53  (p);.  clearAllS
15ed0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
15ee0 6f 63 6b 73 28 70 29 3b 0a 0a 20 20 69 66 28 20  ocks(p);..  if( 
15ef0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15f00 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
15f10 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
15f20 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
15f30 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
15f40 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
15f50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
15f60 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
15f70 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
15f80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15f90 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
15fa0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
15fb0 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
15fc0 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
15fd0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
15fe0 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
15ff0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72   call sqlite3Btr
16000 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
16010 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
16020 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
16030 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
16040 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
16050 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
16060 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
16070 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
16080 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
16090 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
160a0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
160b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
160c0 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
160d0 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
160e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
160f0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
16100 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e    }..  if( p->in
16110 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
16120 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
16130 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
16140 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  on>0 );.    pBt-
16150 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
16160 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
16170 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
16180 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
16190 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
161a0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
161b0 7d 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48  }..  btreeClearH
161c0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
161d0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
161e0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c  RANS_NONE;.  unl
161f0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
16200 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
16210 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
16220 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16230 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
16240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
16250 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
16260 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
16270 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
16280 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  can can be rolle
16290 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
162a0 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
162b0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
162c0 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
162d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
162e0 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
162f0 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
16300 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
16310 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
16320 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
16330 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
16340 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
16350 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
16360 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
16370 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
16380 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
16390 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
163a0 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
163b0 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
163c0 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
163d0 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
163e0 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
163f0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
16400 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
16410 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
16420 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
16430 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
16440 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
16450 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
16460 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
16470 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
16480 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
16490 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
164a0 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
164b0 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
164c0 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
164d0 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
164e0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
164f0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
16500 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
16510 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
16520 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
16530 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
16540 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
16550 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
16560 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
16570 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
16580 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
16590 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
165a0 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
165b0 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
165c0 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
165d0 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
165e0 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
165f0 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
16600 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
16610 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
16620 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
16630 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
16640 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
16650 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
16660 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
16670 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16680 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
16690 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
166a0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
166b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
166c0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
166d0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
166e0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
166f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
16700 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
16710 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
16720 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
16730 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  int );.  if( NEV
16740 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  ER(p->inTrans!=T
16750 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42  RANS_WRITE || pB
16760 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  t->readOnly) ){.
16770 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16780 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73  INTERNAL;.  }els
16790 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
167a0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
167b0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
167c0 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20  ;.    /* At the 
167d0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
167e0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
167f0 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
16800 69 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  int with.    ** 
16810 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
16820 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
16830 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
16840 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
16850 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
16860 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
16870 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
16880 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
16890 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
168a0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
168b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
168c0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
168d0 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
168e0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
168f0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
16900 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
16910 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
16920 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
16930 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16950 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
16960 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
16970 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
16980 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
16990 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
169a0 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
169b0 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
169c0 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
169d0 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
169e0 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
169f0 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
16a00 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
16a10 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
16a20 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
16a30 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
16a40 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
16a50 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
16a60 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
16a70 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
16a80 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
16a90 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
16aa0 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
16ab0 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
16ac0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
16ad0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
16ae0 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
16af0 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
16b00 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
16b10 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
16b20 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
16b30 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
16b40 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
16b50 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
16b60 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
16b70 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
16b80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16b90 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
16ba0 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
16bb0 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
16bc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16bd0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
16be0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
16bf0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
16c00 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16c10 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
16c20 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
16c30 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
16c40 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
16c50 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
16c60 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
16c70 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
16c80 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
16c90 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
16ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
16cb0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 70  eEnter(p);.    p
16cc0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
16cd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16ce0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
16cf0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
16d00 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
16d10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16d20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
16d30 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
16d40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
16d50 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16d60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16d70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
16d80 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
16d90 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
16da0 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
16db0 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
16dc0 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20  le.  The act of 
16dd0 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73  acquiring a curs
16de0 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c  or gets a read l
16df0 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64  ock on .** the d
16e00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
16e10 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
16e20 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
16e30 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
16e40 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
16e50 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
16e60 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
16e70 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
16e80 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
16e90 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
16ea0 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
16eb0 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
16ec0 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
16ed0 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
16ee0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
16ef0 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
16f00 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
16f10 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
16f20 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
16f30 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
16f40 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
16f50 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
16f60 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
16f70 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
16f80 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
16f90 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
16fa0 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
16fb0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
16fc0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
16fd0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
16fe0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
16ff0 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
17000 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
17010 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
17020 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
17030 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
17040 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
17050 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
17060 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
17070 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
17080 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
17090 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
170a0 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
170b0 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
170c0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
170d0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
170e0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
170f0 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
17100 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
17110 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
17120 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
17130 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
17140 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
17150 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
17160 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
17170 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
17180 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
17190 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
171a0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
171b0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
171c0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
171d0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
171e0 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20  Size() bytes of 
171f0 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74  memory .** point
17200 65 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61  ed to by pCur ha
17210 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  ve been zeroed b
17220 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  y the caller..*/
17230 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
17240 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
17250 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17270 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
17280 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
172b0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
172c0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
172d0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
17300 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
17310 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
17320 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
17330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17340 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
17350 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
17360 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
17370 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
17380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17390 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
173a0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sor */.){.  int 
173b0 72 63 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  rc;.  Pgno nPage
173c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
173d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
173e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
173f0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
17400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
17410 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
17420 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 77 72  g==1 );.  if( wr
17430 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 73 73 65  Flag ){.    asse
17440 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
17450 6c 79 20 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  ly );.    if( NE
17460 56 45 52 28 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  VER(pBt->readOnl
17470 79 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  y) ){.      retu
17480 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
17490 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  LY;.    }.    rc
174a0 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43   = checkForReadC
174b0 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
174c0 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  le, 0, 0);.    i
174d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
174e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
174f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43  ( rc==SQLITE_LOC
17500 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 20  KED_SHAREDCACHE 
17510 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17520 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
17530 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
17540 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
17550 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
17560 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ry(p);.    if( r
17570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17580 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
175a0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
175b0 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72 63  gno)iTable;.  rc
175c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
175d0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
175e0 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
175f0 61 67 65 29 3b 20 0a 20 20 69 66 28 20 72 63 21  age); .  if( rc!
17600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
17620 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
17630 20 26 26 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a   && nPage==0 ){.
17640 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17650 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
17660 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
17670 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
17680 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
17690 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
176a0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
176b0 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28  pPage[0]);.  if(
176c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
176d0 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  {.    goto creat
176e0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
176f0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  on;.  }..  /* No
17700 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
17710 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
17720 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
17730 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
17740 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c  .  ** variables,
17750 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
17760 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
17770 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20  ed list and set 
17780 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a  *ppCur (the.  **
17790 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74   output argument
177a0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
177b0 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  n)..  */.  pCur-
177c0 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
177d0 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
177e0 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
177f0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
17800 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75  Cur->wrFlag = (u
17810 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  8)wrFlag;.  pCur
17820 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
17830 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
17840 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
17850 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
17860 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
17870 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
17880 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
17890 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
178a0 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e  NVALID;.  pCur->
178b0 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b  cachedRowid = 0;
178c0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
178d0 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75  E_OK;..create_cu
178e0 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a  rsor_exception:.
178f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
17900 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
17910 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
17920 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65  nused(pBt);.  re
17930 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
17940 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17950 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
17990 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
179c0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
179d0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
179e0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17a10 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
17a20 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
17a30 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
17a40 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
17a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
17a60 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
17a70 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
17a80 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
17ab0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
17ac0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
17ad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17ae0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
17af0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
17b00 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
17b10 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
17b20 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
17b30 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
17b40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17b50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17b60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
17b70 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
17b80 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
17b90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
17ba0 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
17bb0 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
17bc0 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
17bd0 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
17be0 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
17bf0 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
17c00 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
17c10 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
17c20 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
17c30 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
17c40 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
17c50 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
17c60 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
17c70 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
17c80 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
17c90 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
17ca0 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74  return sizeof(Bt
17cb0 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Cursor);.}../*.*
17cc0 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64  * Set the cached
17cd0 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20   rowid value of 
17ce0 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20  every cursor in 
17cf0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
17d00 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75  e file.** as pCu
17d10 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65  r and having the
17d20 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20   same root page 
17d30 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20  number as pCur. 
17d40 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   The value is.**
17d50 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a   set to iRowid..
17d60 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74  **.** Only posit
17d70 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73  ive rowid values
17d80 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
17d90 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63  valid for this c
17da0 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63  ache..** The cac
17db0 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  he is initialize
17dc0 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63  d to zero, indic
17dd0 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64  ating an invalid
17de0 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72   cache..** A btr
17df0 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ee will work fin
17e00 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e  e with zero or n
17e10 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20  egative rowids. 
17e20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a   We just cannot.
17e30 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72  ** cache zero or
17e40 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
17e50 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61  , which means ta
17e60 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65  bles that use ze
17e70 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76  ro or.** negativ
17e80 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72  e rowids might r
17e90 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
17ea0 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63  er.  But in prac
17eb0 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tice, zero.** or
17ec0 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
17ed0 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d   are very uncomm
17ee0 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c  on so this shoul
17ef0 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  d not be a probl
17f00 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
17f10 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
17f20 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
17f30 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69  *pCur, sqlite3_i
17f40 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20  nt64 iRowid){.  
17f50 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
17f60 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e  or(p=pCur->pBt->
17f70 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
17f80 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
17f90 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43   p->pgnoRoot==pC
17fa0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70  ur->pgnoRoot ) p
17fb0 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
17fc0 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73  iRowid;.  }.  as
17fd0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68  sert( pCur->cach
17fe0 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20  edRowid==iRowid 
17ff0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
18000 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  rn the cached ro
18010 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  wid for the give
18020 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67  n cursor.  A neg
18030 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ative or zero.**
18040 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
18050 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
18060 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20   rowid cache is 
18070 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
18080 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64  ld be.** ignored
18090 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20  .  If the rowid 
180a0 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20  cache has never 
180b0 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c  before been set,
180c0 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20   then a.** zero 
180d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
180e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
180f0 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63  lite3BtreeGetCac
18100 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
18110 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
18120 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  rn pCur->cachedR
18130 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  owid;.}../*.** C
18140 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
18150 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
18160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18170 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
18180 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
18190 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
181a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
181b0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
181c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
181d0 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
181e0 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
181f0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
18200 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
18210 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18220 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
18230 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18240 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
18250 42 74 2d 3e 64 62 20 3d 20 70 42 74 72 65 65 2d  Bt->db = pBtree-
18260 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >db;.    sqlite3
18270 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
18280 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
18290 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
182a0 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76       pCur->pPrev
182b0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
182c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
182d0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
182e0 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
182f0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
18300 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
18310 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  .      pCur->pNe
18320 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
18330 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20  ->pPrev;.    }. 
18340 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
18350 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
18360 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
18370 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
18380 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
18390 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
183a0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
183b0 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
183c0 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
183d0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
183e0 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
183f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18400 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
18410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
18430 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
18440 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e  or by filling in
18450 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70   the fields of p
18460 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20  TempCur..** The 
18470 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
18480 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
18490 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74  ursor list for t
184a0 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  he Btree..*/.voi
184b0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  d sqlite3BtreeGe
184c0 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  tTempCursor(BtCu
184d0 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75  rsor *pCur, BtCu
184e0 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b  rsor *pTempCur){
184f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
18500 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
18510 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
18520 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c  memcpy(pTempCur,
18530 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74   pCur, sizeof(Bt
18540 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d  Cursor));.  pTem
18550 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pCur->pNext = 0;
18560 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72  .  pTempCur->pPr
18570 65 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ev = 0;.  for(i=
18580 30 3b 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e  0; i<=pTempCur->
18590 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
185a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
185b0 28 70 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67  (pTempCur->apPag
185c0 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a  e[i]->pDbPage);.
185d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
185e0 65 6d 70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20  empCur->pKey==0 
185f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  );.}../*.** Dele
18600 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  te a temporary c
18610 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61  ursor such as wa
18620 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72  s made by the Cr
18630 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72  eateTemporaryCur
18640 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  sor().** functio
18650 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64  n above..*/.void
18660 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
18670 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42  easeTempCursor(B
18680 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
18690 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
186a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
186b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66  tex(pCur) );.  f
186c0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
186d0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
186e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
186f0 72 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ref(pCur->apPage
18700 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
18710 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
18720 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d  e(pCur->pKey);.}
18730 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  ..../*.** Make s
18740 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
18750 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
18760 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
18770 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
18780 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
18790 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
187a0 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
187b0 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  l.** sqlite3Btre
187c0 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
187d0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
187e0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
187f0 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
18800 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
18810 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
18820 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
18830 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
18840 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
18850 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
18860 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
18870 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
18880 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
18890 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
188a0 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
188b0 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
188c0 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
188d0 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
188e0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
188f0 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
18900 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
18910 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
18920 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
18930 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
18940 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
18950 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
18960 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
18970 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
18980 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
18990 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
189a0 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c  ng agressive inl
189b0 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
189c0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
189d0 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
189e0 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
189f0 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
18a00 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
18a10 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
18a20 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
18a30 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
18a40 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
18a50 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
18a60 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
18a70 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
18a80 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
18a90 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
18aa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
18ab0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
18ac0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
18ad0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
18ae0 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
18af0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
18b00 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
18b10 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
18b20 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
18b30 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
18b40 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
18b50 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
18b60 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
18b70 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
18b80 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
18b90 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
18ba0 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
18bb0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
18bc0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
18bd0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
18be0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
18bf0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
18c00 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
18c10 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 73  ->iPage;.      s
18c20 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
18c30 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
18c40 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
18c50 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
18c60 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
18c70 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
18c80 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
18c90 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c        assertCell
18ca0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
18cb0 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  }.  }.#else /* i
18cc0 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a  f not _MSC_VER *
18cd0 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63  /.  /* Use a mac
18ce0 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ro in all other 
18cf0 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61  compilers so tha
18d00 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
18d10 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65  s inlined */.#de
18d20 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f  fine getCellInfo
18d30 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20  (pCur)          
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
18d70 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
18d80 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20  Size==0 ){      
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
18dc0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
18dd0 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20  Cur->iPage;     
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 20 20 20 20 20 20 20 20 20                  
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
18e10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18e20 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
18e30 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
18e40 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
18e50 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c  ,&pCur->info); \
18e60 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
18e70 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20  NKey = 1;       
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18eb0 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f00 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c   \.    assertCel
18f10 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20  lInfo(pCur);    
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f50 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    \.  }.#endif /
18f60 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f  * _MSC_VER */../
18f70 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
18f80 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
18f90 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
18fa0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
18fb0 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
18fc0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
18fd0 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
18fe0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
18ff0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
19000 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
19010 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
19020 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
19030 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
19040 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
19050 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19060 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
19070 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
19080 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
19090 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  the key..*/.int 
190a0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
190b0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
190c0 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
190d0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
190e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
190f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
19100 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
19110 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
19120 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
19130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
19140 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19150 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
19160 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
19170 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19180 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
19190 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
191a0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
191b0 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
191c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
191d0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
191e0 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  );.      *pSize 
191f0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
19200 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  y;.    }.  }.  r
19210 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19220 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
19230 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19240 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
19250 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
19260 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
19270 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c  y points to.  Al
19280 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49  ways return SQLI
19290 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72  TE_OK..** Failur
192a0 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
192b0 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  e.  If the curso
192c0 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  r is not current
192d0 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  ly.** pointing t
192e0 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63  o an entry (whic
192f0 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f  h can happen, fo
19300 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
19310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
19320 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53   empty) then *pS
19330 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
19340 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19350 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
19360 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
19370 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
19380 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
19390 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
193a0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
193b0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
193c0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
193d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
193e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
193f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19400 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
19410 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19420 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
19430 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19440 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
19450 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  ID ){.      /* N
19460 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
19470 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73   valid entry - s
19480 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20  et *pSize to 0. 
19490 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  */.      *pSize 
194a0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
194b0 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
194c0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  o(pCur);.      *
194d0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
194e0 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a  fo.nData;.    }.
194f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
19510 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
19520 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
19530 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
19540 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
19550 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
19560 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
19570 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
19580 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
19590 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
195a0 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
195b0 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
195c0 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
195d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
195e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
195f0 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
19600 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
19610 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
19620 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
19630 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
19640 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
19650 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
19660 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
19670 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
19680 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
19690 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
196a0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
196b0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
196c0 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
196d0 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
196e0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
196f0 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
19700 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
19710 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
19720 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
19730 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
19740 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
19750 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
19760 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
19770 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
19780 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
19790 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
197a0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
197b0 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
197c0 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
197d0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
197e0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
197f0 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
19800 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
19810 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
19820 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
19830 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
19840 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
19850 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
19860 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
19870 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
19880 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
19890 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
198a0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
198b0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
198c0 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
198d0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
198e0 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  Bt, .  Pgno ovfl
198f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19900 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20      /* Overflow 
19910 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  page */.  MemPag
19920 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
19930 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
19940 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
19950 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
19960 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
19970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19980 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
19990 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
199a0 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
199b0 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
199c0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
199d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
199e0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
199f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19a00 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19a10 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
19a20 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
19a30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
19a40 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
19a50 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
19a60 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
19a70 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
19a80 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
19a90 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
19aa0 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
19ab0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
19ac0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
19ad0 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
19ae0 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
19af0 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
19b00 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
19b10 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
19b20 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
19b30 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
19b40 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
19b50 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
19b60 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
19b70 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
19b80 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
19b90 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
19ba0 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
19bb0 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
19bc0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
19bd0 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
19be0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
19bf0 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
19c00 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
19c10 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
19c20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
19c30 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
19c40 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
19c50 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
19c60 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
19c70 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
19c80 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
19c90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19ca0 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
19cb0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
19cc0 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
19cd0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
19ce0 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
19cf0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
19d00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19d10 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
19d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19d30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19d40 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
19d50 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
19d60 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72  0);.    assert(r
19d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
19d80 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69  pPage==0);.    i
19d90 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63  f( next==0 && rc
19da0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19db0 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
19dc0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
19dd0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
19de0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
19df0 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
19e00 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
19e10 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
19e20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
19e30 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
19e40 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
19e50 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
19e60 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
19e70 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
19e80 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
19e90 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
19ea0 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
19eb0 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
19ec0 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
19ed0 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
19ee0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
19ef0 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
19f00 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
19f10 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
19f20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
19f30 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
19f40 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
19f50 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
19f60 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
19f70 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
19f80 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
19f90 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
19fa0 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
19fb0 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
19fc0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
19fd0 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
19fe0 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
19ff0 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
1a000 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1a010 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
1a020 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
1a030 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
1a040 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
1a050 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
1a060 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1a070 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
1a080 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
1a090 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1a0a0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1a0b0 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
1a0c0 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
1a0d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a0e0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
1a0f0 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
1a120 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
1a130 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
1a140 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
1a150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1a160 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
1a170 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
1a180 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
1a190 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1a1a0 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
1a1b0 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
1a1c0 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
1a1d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1a1e0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1a1f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1a210 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a220 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
1a230 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
1a240 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1a250 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1a260 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
1a270 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
1a280 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
1a290 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
1a2a0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
1a2b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a2c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1a2d0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1a2e0 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
1a2f0 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
1a300 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
1a310 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
1a320 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
1a330 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49  s pointing to. I
1a340 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72  f the eOp.** par
1a350 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69  ameter is 0, thi
1a360 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
1a370 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69  ation (data copi
1a380 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65  ed into.** buffe
1a390 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69  r pBuf). If it i
1a3a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72  s non-zero, a wr
1a3b0 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64  ite (data copied
1a3c0 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20   from.** buffer 
1a3d0 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  pBuf)..**.** A t
1a3e0 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
1a3f0 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
1a400 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
1a410 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
1a420 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
1a430 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
1a440 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
1a450 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1a460 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69  es not make a di
1a470 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65  stinction betwee
1a480 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a  n key and data..
1a490 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73  ** It just reads
1a4a0 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73   or writes bytes
1a4b0 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61   from the payloa
1a4c0 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69  d area.  Data mi
1a4d0 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f  ght .** appear o
1a4e0 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20  n the main page 
1a4f0 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
1a500 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
1a510 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67  overflow .** pag
1a520 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
1a530 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72   BtCursor.isIncr
1a540 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1a550 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20  is set, and the 
1a560 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f  current.** curso
1a570 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65  r entry uses one
1a580 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
1a590 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75  w pages, this fu
1a5a0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
1a5b0 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e  tes space for an
1a5c0 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74  d lazily popluat
1a5d0 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
1a5e0 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61  page-list .** ca
1a5f0 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
1a600 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
1a610 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
1a620 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63   use this.** cac
1a630 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
1a640 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
1a650 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65  ed offset more e
1a660 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
1a670 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
1a680 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1a690 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1a6a0 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
1a6b0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
1a6c0 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
1a6d0 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
1a6e0 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
1a6f0 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
1a700 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
1a710 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
1a720 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
1a730 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
1a740 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
1a750 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
1a760 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
1a770 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1a780 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
1a790 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1a7a0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
1a7b0 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
1a7c0 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
1a7d0 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
1a7e0 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
1a7f0 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
1a800 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
1a810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1a820 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
1a830 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1a840 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
1a850 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
1a860 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
1a870 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
1a880 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1a890 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
1a8a0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
1a8b0 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
1a8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
1a8d0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1a8e0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1a8f0 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
1a900 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
1a910 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
1a920 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  / .  int skipKey
1a930 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  ,         /* off
1a940 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61  set begins at da
1a950 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
1a960 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20  ue */.  int eOp 
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a980 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
1a990 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
1a9a0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
1a9b0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
1a9c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a9d0 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
1a9e0 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
1a9f0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1aa00 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1aa10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1aa20 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
1aa30 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
1aa40 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1aa50 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa70 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
1aa80 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
1aa90 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
1aaa0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
1aab0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1aac0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1aad0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1aae0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1aaf0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
1ab00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1ab10 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ab20 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65  Cur) );..  getCe
1ab30 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1ab40 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1ab50 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
1ab60 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1ab70 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
1ab80 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
1ab90 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1aba0 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b  nKey);..  if( sk
1abb0 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66  ipKey ){.    off
1abc0 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d  set += nKey;.  }
1abd0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d  .  if( offset+am
1abe0 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
1abf0 6e 66 6f 2e 6e 44 61 74 61 20 0a 20 20 20 7c 7c  nfo.nData .   ||
1ac00 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
1ac10 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
1ac20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
1ac30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
1ac40 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
1ac50 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
1ac60 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
1ac70 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
1ac80 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
1ac90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1aca0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1acb0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
1acc0 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
1acd0 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
1ace0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
1acf0 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
1ad00 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
1ad10 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1ad20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
1ad30 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
1ad40 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1ad50 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
1ad60 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1ad70 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
1ad80 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
1ad90 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
1ada0 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
1adb0 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
1adc0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
1add0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
1ade0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
1adf0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
1ae00 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
1ae10 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
1ae20 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1ae30 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
1ae40 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
1ae50 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
1ae60 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
1ae70 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
1ae80 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
1ae90 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
1aea0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
1aeb0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1aec0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
1aed0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
1aee0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aef0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1af00 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
1af10 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1af20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
1af30 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1af40 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
1af50 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
1af60 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
1af70 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
1af80 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
1af90 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
1afa0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
1afb0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1afc0 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
1afd0 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
1afe0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
1aff0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
1b000 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
1b010 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
1b020 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
1b030 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
1b040 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
1b050 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
1b060 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
1b070 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
1b080 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
1b090 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
1b0a0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
1b0b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1b0c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
1b0d0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
1b0e0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
1b0f0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
1b100 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
1b110 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
1b120 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
1b130 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1b140 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
1b150 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69  *nOvfl);.      i
1b160 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75  f( nOvfl && !pCu
1b170 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1b180 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b190 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1b1a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1b1b0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
1b1c0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1b1d0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1b1e0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
1b1f0 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1b200 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
1b210 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1b220 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
1b230 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
1b240 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
1b250 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1b260 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1b270 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
1b280 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
1b290 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
1b2a0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
1b2b0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1b2c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1b2d0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
1b2e0 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
1b2f0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1b300 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
1b310 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1b320 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
1b330 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
1b340 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1b350 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
1b360 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
1b370 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
1b380 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1b390 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
1b3a0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1b3b0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
1b3c0 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
1b3d0 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
1b3e0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1b3f0 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
1b400 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
1b410 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
1b420 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
1b430 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
1b440 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
1b450 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1b460 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
1b470 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
1b480 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
1b490 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
1b4a0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
1b4b0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1b4c0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
1b4d0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
1b4e0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
1b4f0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
1b500 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
1b510 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
1b520 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
1b530 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
1b540 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
1b550 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
1b560 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
1b570 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
1b580 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
1b590 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b5a0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1b5b0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
1b5c0 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1b5d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1b5e0 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
1b5f0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
1b600 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1b610 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
1b620 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
1b630 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
1b640 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
1b650 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
1b660 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1b670 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
1b680 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
1b690 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
1b6a0 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
1b6b0 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
1b6c0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
1b6d0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1b6e0 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
1b6f0 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
1b700 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
1b710 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
1b720 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b730 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
1b740 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
1b750 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
1b760 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b770 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
1b780 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
1b790 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1b7a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b7b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
1b7c0 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
1b7d0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
1b7e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1b7f0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1b800 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
1b810 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
1b820 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
1b830 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1b840 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
1b850 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1b860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b870 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
1b880 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
1b890 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
1b8a0 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
1b8b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b8c0 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
1b8d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
1b8e0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
1b8f0 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
1b900 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
1b910 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
1b920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b930 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b940 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1b950 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b960 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1b970 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1b990 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
1b9a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1b9b0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
1b9c0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
1b9d0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
1b9e0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
1b9f0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
1ba00 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
1ba10 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
1ba20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1ba30 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
1ba40 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1ba50 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1ba60 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
1ba70 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
1ba80 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
1ba90 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
1baa0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
1bab0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
1bac0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
1bad0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1bae0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1baf0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1bb00 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1bb10 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1bb20 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1bb30 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1bb40 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1bb50 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1bb60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1bb70 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1bb80 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1bb90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1bba0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1bbb0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1bbc0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1bbd0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50     if( pCur->apP
1bbe0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
1bbf0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1bc00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1bc10 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
1bc20 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1bc30 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1bc40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1bc50 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
1bc60 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
1bc70 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
1bc80 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
1bc90 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
1bca0 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  f, 0, 0);.  }.  
1bcb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bcc0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
1bcd0 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
1bce0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
1bcf0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
1bd00 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
1bd10 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
1bd20 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
1bd30 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
1bd40 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
1bd50 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
1bd60 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1bd70 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
1bd80 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
1bd90 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
1bda0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
1bdb0 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
1bdc0 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
1bdd0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
1bde0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
1bdf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1be00 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
1be10 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
1be20 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
1be30 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
1be40 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
1be50 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1be60 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
1be70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1be80 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
1be90 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
1bea0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
1beb0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1bec0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1bed0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1bee0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1bef0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1bf00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bf10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1bf20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1bf30 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
1bf40 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1bf50 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1bf60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1bf70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1bf80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1bf90 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1bfa0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1bfb0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1bfc0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
1bfd0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1bfe0 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30   amt, pBuf, 1, 0
1bff0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c000 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1c010 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1c020 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1c030 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
1c040 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
1c050 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
1c060 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
1c070 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
1c080 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1c090 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
1c0a0 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
1c0b0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
1c0c0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
1c0d0 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
1c0e0 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
1c0f0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
1c100 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
1c110 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
1c120 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
1c130 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
1c140 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
1c150 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
1c160 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
1c170 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c180 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
1c190 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
1c1a0 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
1c1b0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
1c1c0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
1c1d0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
1c1e0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
1c1f0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
1c200 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
1c210 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
1c220 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
1c230 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
1c240 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
1c250 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
1c260 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
1c270 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
1c280 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
1c290 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
1c2a0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
1c2b0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
1c2c0 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
1c2d0 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
1c2e0 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
1c2f0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
1c300 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
1c310 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
1c320 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
1c330 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
1c340 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
1c350 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1c360 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
1c370 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
1c380 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
1c390 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
1c3a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1c3b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
1c3c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c3d0 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
1c3e0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1c3f0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
1c400 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
1c410 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
1c420 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
1c430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1c440 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
1c450 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
1c460 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
1c470 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
1c480 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
1c490 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
1c4a0 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
1c4b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1c4c0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
1c4d0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
1c4e0 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
1c4f0 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
1c500 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
1c510 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
1c520 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1c530 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
1c540 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1c550 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1c560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1c570 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c580 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
1c590 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1c5a0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
1c5b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1c5c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1c5d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1c5e0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1c5f0 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
1c600 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
1c610 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
1c620 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
1c630 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
1c640 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
1c650 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
1c660 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28  se{.    nKey = (
1c670 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
1c680 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
1c690 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
1c6a0 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
1c6b0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1c6c0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1c6d0 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
1c6e0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1c6f0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1c700 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
1c710 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
1c720 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
1c730 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
1c740 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
1c750 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
1c760 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
1c770 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
1c780 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
1c790 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
1c7a0 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
1c7b0 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
1c7c0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
1c7d0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
1c7e0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
1c7f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1c800 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
1c810 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
1c820 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
1c830 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
1c840 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
1c850 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
1c860 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
1c870 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
1c880 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
1c890 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
1c8a0 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
1c8b0 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
1c8c0 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
1c8d0 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
1c8e0 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
1c8f0 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
1c900 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
1c910 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
1c920 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
1c930 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
1c940 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
1c950 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
1c960 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
1c970 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
1c980 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
1c990 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
1c9a0 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
1c9b0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
1c9c0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
1c9d0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
1c9e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1c9f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1ca00 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1ca10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ca20 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1ca30 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1ca40 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1ca50 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
1ca60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
1ca70 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1ca80 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
1ca90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1caa0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
1cab0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1cac0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1cad0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1cae0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1caf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1cb00 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
1cb10 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
1cb20 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
1cb30 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
1cb40 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1cb50 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
1cb60 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
1cb70 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
1cb80 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
1cb90 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1cba0 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
1cbb0 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve to..*/.static
1cbc0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
1cbd0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1cbe0 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
1cbf0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
1cc00 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1cc10 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
1cc20 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
1cc30 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1cc40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1cc50 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1cc60 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1cc70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1cc80 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1cc90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1cca0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
1ccb0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28  X_DEPTH );.  if(
1ccc0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
1ccd0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
1cce0 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
1ccf0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1cd00 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
1cd10 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
1cd20 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
1cd30 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66  &pNewPage);.  if
1cd40 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1cd50 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
1cd60 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
1cd70 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
1cd80 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
1cd90 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
1cda0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1cdb0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1cdc0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
1cdd0 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
1cde0 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <1 ){.    return
1cdf0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ce00 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1ce10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1ce20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ce30 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
1ce40 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
1ce50 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
1ce60 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
1ce70 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
1ce80 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
1ce90 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
1cea0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
1ceb0 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
1cec0 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
1ced0 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
1cee0 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
1cef0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
1cf00 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
1cf10 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
1cf20 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
1cf30 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
1cf40 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
1cf50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1cf60 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1cf70 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
1cf80 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
1cf90 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73  o iChild){.  ass
1cfa0 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
1cfb0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
1cfc0 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
1cfd0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
1cfe0 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
1cff0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
1d000 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
1d010 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
1d020 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1d030 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
1d040 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
1d050 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
1d060 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
1d070 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
1d080 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
1d090 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
1d0a0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1d0b0 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
1d0c0 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
1d0d0 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
1d0e0 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
1d0f0 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
1d100 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
1d110 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
1d120 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
1d130 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
1d140 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
1d150 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
1d160 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
1d170 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
1d180 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
1d190 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
1d1a0 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
1d1b0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
1d1c0 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
1d1d0 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
1d1e0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1d1f0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1d200 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1d210 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1d220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d230 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
1d240 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1d250 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1d260 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
1d270 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
1d280 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1d290 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
1d2a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1d2b0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
1d2c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1d2d0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
1d2e0 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  .  );.  releaseP
1d2f0 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1d300 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
1d310 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
1d320 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1d330 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1d340 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1d350 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1d360 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1d370 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61  root page.*/.sta
1d380 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
1d390 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
1d3a0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
1d3b0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
1d3c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
1d3d0 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
1d3e0 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
1d3f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1d400 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1d410 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d420 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1d430 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
1d440 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1d450 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
1d460 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
1d470 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
1d480 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
1d490 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
1d4a0 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
1d4b0 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
1d4c0 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
1d4d0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1d4e0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1d4f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d500 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72  FAULT ){.      r
1d510 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
1d520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1d530 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1d540 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
1d550 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1d560 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e>=0 ){.    int 
1d570 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
1d580 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
1d590 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1d5a0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1d5b0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
1d5c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1d5d0 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
1d5e0 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49  K!=(rc = getAndI
1d5f0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
1d600 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
1d610 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 29 0a  ur->apPage[0])).
1d620 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75      ){.      pCu
1d630 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1d640 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1d650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d660 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f 6f 74 20   }.  }..  pRoot 
1d670 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
1d680 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
1d690 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
1d6a0 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 70 43  pgnoRoot );.  pC
1d6b0 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
1d6c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
1d6d0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
1d6e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1d6f0 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
1d700 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1d710 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ey = 0;..  if( p
1d720 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
1d730 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
1d740 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
1d750 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ge;.    assert( 
1d760 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pRoot->pgno==1 )
1d770 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
1d780 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
1d790 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
1d7a0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1d7b0 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65   assert( subpage
1d7c0 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 );.    pCur->
1d7d0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1d7e0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
1d7f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1d800 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
1d810 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
1d820 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d  State = ((pRoot-
1d830 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52  >nCell>0)?CURSOR
1d840 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e  _VALID:CURSOR_IN
1d850 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65  VALID);.  }.  re
1d860 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d870 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1d880 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
1d890 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
1d8a0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1d8b0 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
1d8c0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
1d8d0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
1d8e0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
1d8f0 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
1d900 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
1d910 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
1d920 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
1d930 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
1d940 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
1d950 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
1d960 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
1d970 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
1d980 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
1d990 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1d9a0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1d9b0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1d9c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1d9d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1d9e0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
1d9f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1da00 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
1da10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1da20 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
1da30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1da40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1da50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1da60 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
1da70 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1da80 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
1da90 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1daa0 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
1dab0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1dac0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
1dad0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1dae0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1daf0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
1db00 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
1db10 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1db20 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
1db30 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
1db40 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
1db50 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
1db60 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
1db70 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
1db80 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1db90 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
1dba0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1dbb0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
1dbc0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
1dbd0 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
1dbe0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
1dbf0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
1dc00 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
1dc10 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
1dc20 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
1dc30 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
1dc40 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
1dc50 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
1dc60 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
1dc70 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
1dc80 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1dc90 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
1dca0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1dcb0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
1dcc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1dcd0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
1dce0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
1dcf0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1dd00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1dd10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1dd20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1dd30 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1dd40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dd50 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
1dd60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1dd70 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
1dd80 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1dd90 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1dda0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1ddb0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
1ddc0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1ddd0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
1dde0 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
1ddf0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1de00 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
1de10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1de20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
1de30 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1de40 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1de50 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1de60 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1de70 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1de80 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1de90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1dea0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1deb0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1dec0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1ded0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1dee0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1def0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1df00 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1df10 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1df20 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1df30 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1df40 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1df50 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1df60 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1df70 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1df80 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1df90 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1dfa0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1dfb0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1dfc0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1dfd0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1dfe0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1dff0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1e000 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1e010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e020 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1e030 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1e040 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1e050 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1e060 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e070 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
1e080 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1e090 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e0a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1e0b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e0c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e0d0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
1e0e0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1e0f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1e100 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1e110 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1e120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e130 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1e140 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
1e150 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1e160 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1e170 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1e180 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1e190 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1e1a0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1e1b0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1e1c0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1e1d0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1e1e0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1e1f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
1e200 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
1e210 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1e220 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
1e230 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e240 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e250 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e260 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1e270 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1e280 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1e290 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1e2a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e2b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1e2c0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1e2d0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1e2e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e2f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e300 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
1e310 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
1e320 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
1e330 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e340 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e350 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e360 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1e370 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1e380 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1e390 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1e3a0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1e3b0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
1e3c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a  c==SQLITE_OK ?1:
1e3d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1e3e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1e3f0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1e400 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1e410 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
1e420 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
1e430 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
1e440 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
1e450 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1e460 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1e470 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1e480 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
1e490 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
1e4a0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
1e4b0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
1e4c0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
1e4d0 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
1e4e0 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
1e4f0 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
1e500 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
1e510 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
1e520 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1e530 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
1e540 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
1e550 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
1e560 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
1e570 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
1e580 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
1e590 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
1e5a0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
1e5b0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
1e5c0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
1e5d0 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
1e5e0 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
1e5f0 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
1e600 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
1e610 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
1e620 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
1e630 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
1e640 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
1e650 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
1e660 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
1e670 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
1e680 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
1e690 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1e6a0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
1e6b0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1e6c0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1e6d0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1e6e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e6f0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
1e700 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
1e710 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
1e720 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
1e750 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
1e760 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
1e770 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
1e780 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
1e790 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1e7a0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1e7b0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1e7c0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
1e7d0 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
1e7e0 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
1e7f0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
1e800 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1e810 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1e820 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1e830 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e840 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
1e850 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
1e860 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
1e870 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1e880 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
1e890 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
1e8a0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1e8b0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
1e8c0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1e8d0 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
1e8e0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1e8f0 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
1e900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1e910 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
1e920 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
1e930 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
1e940 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
1e950 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
1e960 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
1e970 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
1e980 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1e990 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
1e9a0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1e9b0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1e9c0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1e9d0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1e9e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1e9f0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1ea00 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1ea10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1ea20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
1ea30 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
1ea40 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
1ea50 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
1ea60 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
1ea70 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
1ea80 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
1ea90 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
1eaa0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1eab0 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61  ALID && pCur->va
1eac0 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70  lidNKey .   && p
1ead0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
1eae0 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
1eaf0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1eb00 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
1eb10 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1eb20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1eb30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1eb40 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c     if( pCur->atL
1eb50 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  ast && pCur->inf
1eb60 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
1eb70 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
1eb80 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1eb90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1eba0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
1ebb0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1ebc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1ebd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1ebe0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1ebf0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1ec00 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
1ec10 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1ec20 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
1ec30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1ec40 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1ec50 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
1ec60 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
1ec70 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1ec80 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1ec90 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1eca0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ecb0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1ecc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
1ecd0 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  ->intKey || pIdx
1ece0 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
1ecf0 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
1ed00 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c  pr;.    Pgno chl
1ed10 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
1ed20 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
1ed30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ed40 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ge];.    int c =
1ed50 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65   -1;  /* pRes re
1ed60 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73  turn if table is
1ed70 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d   empty must be -
1ed80 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30  1 */.    lwr = 0
1ed90 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
1eda0 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
1edb0 69 66 28 20 28 21 70 50 61 67 65 2d 3e 69 6e 74  if( (!pPage->int
1edc0 4b 65 79 20 26 26 20 70 49 64 78 4b 65 79 3d 3d  Key && pIdxKey==
1edd0 30 29 20 7c 7c 20 75 70 72 3c 30 20 29 7b 0a 20  0) || upr<0 ){. 
1ede0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1edf0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1ee00 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1ee10 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
1ee20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74     if( biasRight
1ee30 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1ee40 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1ee50 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20  e] = (u16)upr;. 
1ee60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ee70 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1ee80 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
1ee90 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20  ((upr+lwr)/2);. 
1eea0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29     }.    for(;;)
1eeb0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43  {.      void *pC
1eec0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36  ellKey;.      i6
1eed0 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
1eee0 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
1eef0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1ef00 61 67 65 5d 3b 0a 20 20 20 20 20 20 70 43 75 72  age];.      pCur
1ef10 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1ef20 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
1ef30 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
1ef40 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1ef50 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
1ef60 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
1ef70 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
1ef80 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
1ef90 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
1efa0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1efb0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1efc0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
1efd0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
1efe0 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
1eff0 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
1f000 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
1f010 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
1f020 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
1f030 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
1f040 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
1f050 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
1f060 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
1f070 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f080 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
1f090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1f0a0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1f0b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
1f0c0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  sert( nCellKey>i
1f0d0 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
1f0e0 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20     c = +1;.     
1f0f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1f100 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76  {.        int av
1f110 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ailable;.       
1f120 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69   pCellKey = (voi
1f130 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  d *)fetchPayload
1f140 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c  (pCur, &availabl
1f150 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e  e, 0);.        n
1f160 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e  CellKey = pCur->
1f170 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
1f180 20 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65     if( available
1f190 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20  >=nCellKey ){.  
1f1a0 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
1f1b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1f1c0 70 61 72 65 28 28 69 6e 74 29 6e 43 65 6c 6c 4b  pare((int)nCellK
1f1d0 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ey, pCellKey, pI
1f1e0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
1f1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f200 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
1f210 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29  te3Malloc( (int)
1f220 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20  nCellKey );.    
1f230 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
1f240 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
1f250 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f260 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1f270 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1f280 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
1f290 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1f2a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
1f2b0 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ey(pCur, 0, (int
1f2c0 29 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64  )nCellKey, (void
1f2d0 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  *)pCellKey);.   
1f2e0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
1f2f0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1f300 61 72 65 28 28 69 6e 74 29 6e 43 65 6c 6c 4b 65  are((int)nCellKe
1f310 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  y, pCellKey, pId
1f320 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
1f330 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1f340 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1f350 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
1f360 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
1f370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f380 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
1f390 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
1f3a0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
1f3b0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
1f3c0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1f3d0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
1f3e0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
1f3f0 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
1f400 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20      upr = lwr - 
1f410 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1f420 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1f430 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  e{.          *pR
1f440 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
1f450 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1f460 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1f470 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
1f480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f490 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
1f4a0 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
1f4b0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65   idx+1;.      }e
1f4c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
1f4d0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
1f4e0 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
1f4f0 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  upr ){.        p
1f500 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
1f510 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1f520 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1f530 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  }.      pCur->ai
1f540 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1f550 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70   = (u16)((lwr+up
1f560 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
1f570 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
1f580 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
1f590 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1f5a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1f5b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1f5c0 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
1f5d0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1f5e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1f5f0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1f600 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1f610 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1f620 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1f630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
1f640 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
1f650 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
1f660 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
1f670 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
1f680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f690 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f6a0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1f6b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f6c0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1f6d0 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
1f6e0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
1f6f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f700 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1f710 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
1f720 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1f730 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
1f740 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  6)lwr;.    pCur-
1f750 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1f760 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1f770 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  NKey = 0;.    rc
1f780 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1f790 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
1f7a0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1f7b0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1f7c0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
1f7d0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
1f7e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
1f7f0 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
1f800 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
1f810 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
1f820 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
1f830 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
1f840 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1f850 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
1f860 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
1f870 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
1f880 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
1f890 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
1f8a0 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ork..*/.int sqli
1f8b0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a  te3BtreeMoveto(.
1f8c0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1f8d0 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
1f8e0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
1f8f0 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
1f900 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1f910 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
1f920 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
1f930 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
1f940 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
1f950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
1f960 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
1f970 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
1f980 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
1f990 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
1f9a0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
1f9b0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
1f9c0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
1f9d0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
1f9e0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
1f9f0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
1fa00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
1fa30 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1fa40 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
1fa50 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
1fa60 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1fa70 65 64 52 65 63 6f 72 64 20 61 53 70 61 63 65 5b  edRecord aSpace[
1fa80 31 36 5d 3b 20 2f 2a 20 54 65 6d 70 20 73 70 61  16]; /* Temp spa
1fa90 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d  ce for pIdxKey -
1faa0 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c   to avoid a mall
1fab0 6f 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65  oc */..  if( pKe
1fac0 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
1fad0 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74   nKey==(i64)(int
1fae0 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64  )nKey );.    pId
1faf0 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
1fb00 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
1fb10 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
1fb20 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a  int)nKey, pKey,.
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69        aSpace, si
1fb60 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20  zeof(aSpace));. 
1fb70 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
1fb80 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1fb90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
1fba0 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  {.    pIdxKey = 
1fbb0 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  0;.  }.  rc = sq
1fbc0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
1fbd0 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70  Unpacked(pCur, p
1fbe0 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69  IdxKey, nKey, bi
1fbf0 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28  as, pRes);.  if(
1fc00 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c   pKey ){.    sql
1fc10 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
1fc20 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64  packedRecord(pId
1fc30 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  xKey);.  }.  ret
1fc40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1fc50 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1fc60 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1fc70 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
1fc80 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
1fc90 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
1fca0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
1fcb0 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
1fcc0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
1fcd0 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
1fce0 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
1fcf0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
1fd00 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
1fd10 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
1fd20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
1fd30 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
1fd40 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
1fd50 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1fd60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fd70 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
1fd80 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
1fd90 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
1fda0 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
1fdb0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1fdc0 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
1fdd0 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
1fde0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
1fdf0 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
1fe00 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
1fe10 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
1fe20 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
1fe30 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
1fe40 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
1fe50 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
1fe60 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
1fe70 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
1fe80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
1fe90 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1fea0 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63  n handle for a c
1feb0 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ursor..*/.sqlite
1fec0 33 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43  3 *sqlite3BtreeC
1fed0 75 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74  ursorDb(const Bt
1fee0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1fef0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ff00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1ff10 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1ff20 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
1ff30 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
1ff40 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  b;.}../*.** Adva
1ff50 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
1ff60 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
1ff70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1ff80 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
1ff90 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
1ffa0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
1ffb0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
1ffc0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
1ffd0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1ffe0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
1fff0 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
20000 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
20010 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
20020 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
20030 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
20040 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
20050 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
20060 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
20070 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
20080 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
20090 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
200a0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
200b0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
200c0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
200d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
200e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
200f0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  }.  assert( pRes
20100 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52  !=0 );.  if( CUR
20110 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
20120 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
20130 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
20140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
20160 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20  ->skip>0 ){.    
20170 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
20180 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
20190 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
201a0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
201b0 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50  >skip = 0;..  pP
201c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
201d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
201e0 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
201f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
20200 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
20210 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
20220 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70    assert( idx<=p
20230 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
20240 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
20250 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
20260 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
20270 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
20280 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
20290 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
202a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
202b0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
202c0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
202d0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
202e0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
202f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20300 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
20310 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
20320 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
20330 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
20340 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
20350 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
20360 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
20370 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
20380 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
20390 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
203a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
203b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
203c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
203d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
203e0 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70  eeMoveToParent(p
203f0 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
20400 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
20410 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
20420 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
20430 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
20440 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
20450 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  l );.    *pRes =
20460 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
20470 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
20480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
20490 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
204a0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
204b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
204c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
204d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
204e0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
204f0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
20500 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
20510 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
20520 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
20530 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  t(pCur);.  retur
20540 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
20550 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
20560 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
20570 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
20580 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
20590 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
205a0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
205b0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
205c0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
205d0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
205e0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
205f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
20600 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
20610 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
20620 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
20630 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
20640 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
20650 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
20660 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
20670 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
20680 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
20690 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
206a0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
206b0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
206c0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
206d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
206e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
206f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
20700 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
20710 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
20720 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
20730 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
20740 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
20750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20760 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
20770 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
20780 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
20790 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
207a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
207b0 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
207c0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
207d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
207e0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
207f0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
20800 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
20810 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
20820 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
20830 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
20840 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
20850 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
20860 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
20870 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
20880 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
20890 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
208a0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
208b0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
208c0 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
208d0 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
208e0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
208f0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
20900 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
20910 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
20920 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
20930 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
20940 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
20950 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20960 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
20970 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
20980 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70  eeMoveToParent(p
20990 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
209a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
209b0 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
209c0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
209d0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
209e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
209f0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
20a00 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
20a10 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70  Page];.    if( p
20a20 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
20a30 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
20a40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20a50 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
20a60 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
20a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
20a80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20a90 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20    }.  }.  *pRes 
20aa0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
20ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
20ac0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
20ad0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
20ae0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
20af0 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
20b00 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
20b10 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
20b20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20b30 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
20b40 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
20b50 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
20b60 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
20b70 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
20b80 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
20b90 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
20ba0 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
20bb0 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
20bc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
20bd0 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
20be0 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
20bf0 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
20c00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20c10 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
20c20 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
20c30 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
20c40 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
20c50 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
20c60 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
20c70 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
20c80 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
20c90 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
20ca0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
20cb0 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
20cc0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
20cd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
20ce0 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
20cf0 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
20d00 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f   a (feeble) effo
20d10 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
20d20 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
20d30 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
20d40 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
20d50 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
20d60 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
20d70 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
20d80 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
20d90 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
20da0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
20db0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
20dc0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
20dd0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
20de0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
20df0 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72   the "exact" par
20e00 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
20e10 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75   and the page-nu
20e20 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73  mber nearby exis
20e30 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  ts .** anywhere 
20e40 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
20e50 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
20e60 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  renteed to be re
20e70 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
20e80 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
20e90 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
20ea0 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63  bases when alloc
20eb0 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
20ec0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20ed0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
20ee0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
20ef0 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20  pBt, .  MemPage 
20f00 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e  **ppPage, .  Pgn
20f10 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e  o *pPgno, .  Pgn
20f20 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65  o nearby,.  u8 e
20f30 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  xact.){.  MemPag
20f40 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
20f50 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20   rc;.  int n;   
20f60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
20f70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
20f80 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b  list */.  int k;
20f90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20fa0 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
20fb0 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
20fc0 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
20fd0 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
20fe0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
20ff0 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73  Trunk = 0;..  as
21000 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21010 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
21020 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31  tex) );.  pPage1
21030 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
21040 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
21050 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
21060 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b  ]);.  if( n>0 ){
21070 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
21080 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
21090 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
210a0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
210b0 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
210c0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
210d0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
210e0 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
210f0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
21100 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
21110 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
21120 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70  If the 'exact' p
21130 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75  arameter was tru
21140 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  e and a query of
21150 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
21160 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
21170 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
21180 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
21190 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
211a0 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
211b0 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
211c0 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
211d0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
211e0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
211f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
21200 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78  ACUUM.    if( ex
21210 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 70  act && nearby<=p
21220 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
21230 74 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  t) ){.      u8 e
21240 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
21250 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
21260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
21270 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
21280 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
21290 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
212a0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
212b0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
212c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
212d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
212e0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
212f0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
21300 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
21310 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
21320 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
21330 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
21340 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
21350 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
21360 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
21370 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
21380 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
21390 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
213a0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
213b0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
213c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
213d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
213e0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
213f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
21400 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
21410 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
21420 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
21430 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
21440 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
21450 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
21460 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
21470 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
21480 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
21490 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
214a0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
214b0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
214c0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
214d0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
214e0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
214f0 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
21500 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
21510 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
21520 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
21530 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
21540 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
21550 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
21560 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
21570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21580 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
21590 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
215a0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
215b0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
215c0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
215d0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
215e0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
215f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
21600 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
21610 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
21620 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
21630 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
21640 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
21650 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
21660 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
21670 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
21680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
21690 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
216a0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
216b0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
216c0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
216d0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
216e0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
216f0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
21700 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
21710 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
21720 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
21730 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
21740 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
21750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21760 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
21770 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21780 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
21790 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
217a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
217b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
217c0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
217d0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
217e0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
217f0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
21800 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
21810 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
21820 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
21830 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
21840 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
21850 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
21860 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
21870 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
21880 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
21890 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61  e if( k>pBt->usa
218a0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
218b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
218c0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
218d0 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
218e0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
218f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21900 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21910 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
21920 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
21930 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21940 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21950 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21960 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
21970 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
21980 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
21990 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
219a0 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
219b0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
219c0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
219d0 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
219e0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
219f0 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
21a00 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
21a10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
21a20 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
21a30 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
21a40 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
21a50 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
21a60 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
21a70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
21a80 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
21a90 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
21aa0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
21ab0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
21ac0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
21ad0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
21ae0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21af0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
21b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
21b10 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
21b20 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
21b30 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
21b40 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21b50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
21b60 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
21b70 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
21b80 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
21b90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
21ba0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21bb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
21bc0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
21bd0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
21be0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
21bf0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
21c00 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
21c10 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
21c20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
21c30 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
21c40 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
21c50 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
21c60 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
21c70 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
21c80 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
21c90 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
21ca0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
21cb0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
21cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21cd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
21ce0 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
21cf0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
21d00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
21d10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21d30 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
21d40 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
21d50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
21d60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
21d70 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
21d80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21d90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21da0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21db0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21dc0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
21dd0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
21de0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
21df0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21e00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
21e10 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
21e20 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
21e30 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
21e40 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
21e50 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
21e60 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
21e70 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
21e80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
21e90 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
21ea0 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
21eb0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
21ec0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
21ed0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
21ee0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
21ef0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
21f00 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
21f10 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
21f20 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
21f30 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
21f40 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
21f50 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
21f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
21f70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
21f80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21f90 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
21fa0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
21fb0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
21fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21fd0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
21fe0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
21ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22000 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
22010 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
22020 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
22030 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
22050 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
22060 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
22070 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
22080 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
22090 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
220a0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
220b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
220c0 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
220d0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
220e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
220f0 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
22100 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
22110 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
22120 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
22130 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
22140 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22150 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
22160 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
22170 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
22180 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
22190 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
221a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
221b0 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
221c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
221d0 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  i, dist;.       
221e0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
221f0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
22200 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
22210 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
22220 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
22230 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
22240 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
22250 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
22260 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
22270 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
22280 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
22290 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
222a0 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
222b0 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
222c0 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
222d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
222e0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
22300 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
22310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22320 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
22330 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
22340 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
22350 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
22360 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
22370 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
22380 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
22390 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
223a0 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
223b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
223c0 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
223d0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20    Pgno nPage;.  
223e0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
223f0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
22400 20 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50    nPage = pagerP
22410 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
22420 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 50           if( *pP
22430 67 6e 6f 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20  gno>nPage ){.   
22440 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
22450 20 70 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e   page off the en
22460 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
22470 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22480 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
22490 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
224a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
224b0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
224c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
224d0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
224e0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
224f0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
22500 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
22510 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
22520 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22540 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
22550 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
22560 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
22570 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
22580 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
22590 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
225a0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
225b0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
225c0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
225d0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
225e0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
225f0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  1);.          as
22600 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
22610 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
22620 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29  runk->pDbPage) )
22630 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
22640 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
22650 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
22660 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20   *pPgno);.      
22670 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22680 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
22690 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
226a0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
226b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
226c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
226d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
226e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
226f0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
22700 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
22710 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22720 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22730 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22740 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
22750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22760 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
22770 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
22780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22790 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
227a0 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
227b0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
227c0 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
227d0 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
227e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
227f0 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
22800 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
22810 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e  t, so create a n
22820 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20  ew page at the. 
22830 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
22840 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
22850 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61   nPage = pagerPa
22860 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
22870 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65    *pPgno = nPage
22880 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a   + 1;..    if( *
22890 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
228a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
228b0 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
228c0 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  +;.    }..#ifnde
228d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
228e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
228f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
22900 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
22910 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29  E(pBt, *pPgno) )
22920 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
22930 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
22940 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
22950 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
22960 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
22970 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
22980 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
22990 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
229a0 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
229b0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
229c0 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
229d0 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
229e0 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
229f0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
22a00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
22a10 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
22a20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
22a30 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
22a40 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
22a50 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
22a60 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20  , *pPgno));.    
22a70 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
22a80 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
22a90 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
22aa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
22ab0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
22ac0 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29  *pPgno, &pPg, 0)
22ad0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
22ae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22af0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22b00 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
22b10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
22b20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22b30 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
22b40 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
22b50 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28 2a 70  rn rc;.      (*p
22b60 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69  Pgno)++;.      i
22b70 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
22b80 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
22b90 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b  ) ){ (*pPgno)++;
22ba0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
22bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
22bc0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
22bd0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
22be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
22bf0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
22c00 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
22c10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
22c20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
22c30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22c40 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
22c50 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
22c60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22c70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
22c80 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
22c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
22ca0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
22cb0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
22cc0 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
22cd0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
22ce0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
22cf0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
22d00 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
22d10 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
22d20 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
22d30 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
22d40 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  runk);.  if( rc=
22d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22d60 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
22d70 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
22d80 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
22d90 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
22da0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
22db0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
22dc0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
22dd0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
22de0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
22df0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
22e00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22e10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
22e20 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61  s used to add pa
22e30 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20  ge iPage to the 
22e40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
22e50 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20  ee-list. .** It 
22e60 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
22e70 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
22e80 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f  already a part o
22e90 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  f the free-list.
22ea0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
22eb0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
22ec0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
22ed0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
22ee0 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20  is optional..** 
22ef0 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  If the caller ha
22f00 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20  ppens to have a 
22f10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
22f20 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a  emPage object .*
22f30 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
22f40 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61  to page iPage ha
22f50 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ndy, it may pass
22f60 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e   it as the secon
22f70 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68  d value. .** Oth
22f80 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70  erwise, it may p
22f90 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ass NULL..**.** 
22fa0 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  If a pointer to 
22fb0 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  a MemPage object
22fc0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
22fd0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
22fe0 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65  t,.** its refere
22ff0 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74  nce count is not
23000 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73   altered by this
23010 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
23020 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
23030 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  e2(BtShared *pBt
23040 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50  , MemPage *pMemP
23050 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29  age, Pgno iPage)
23060 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  {.  MemPage *pTr
23070 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
23080 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d          /* Free-
23090 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
230a0 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  */.  Pgno iTrunk
230b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
230c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
230d0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d   number of free-
230e0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
230f0 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  */ .  MemPage *p
23100 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
23110 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ge1;      /* Loc
23120 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
23130 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50  page 1 */.  MemP
23140 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72  /* Page being fr
23170 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  eed. May be NULL
23180 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
231b0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
231c0 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231e0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
231f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
23200 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
23210 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23220 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
23230 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
23240 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a  ert( iPage>1 );.
23250 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
23260 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
23270 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
23280 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
23290 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
232a0 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
232b0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
232c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
232d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
232e0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
232f0 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
23300 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
23310 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
23320 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
23330 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
23340 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
23350 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
23360 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
23370 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
23380 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
23390 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
233a0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
233b0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
233c0 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
233d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
233e0 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
233f0 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   If the SQLITE_S
23400 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d  ECURE_DELETE com
23410 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
23420 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
23430 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75  n.  ** always fu
23440 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
23450 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
23460 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
23470 2a 2f 0a 20 20 69 66 28 20 28 21 70 50 61 67 65  */.  if( (!pPage
23480 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
23490 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
234a0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
234b0 2c 20 30 29 29 29 0a 20 20 20 7c 7c 20 20 20 20  , 0))).   ||    
234c0 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 73 71          (rc = sq
234d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
234e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
234f0 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  .  ){.    goto f
23500 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
23510 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d  .  memset(pPage-
23520 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
23530 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
23540 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
23550 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
23560 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
23570 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
23580 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
23590 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
235a0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
235b0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
235c0 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
235d0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63  VACUUM ){.    rc
235e0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
235f0 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
23600 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20  FREEPAGE, 0);.  
23610 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
23620 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
23630 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
23640 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
23650 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
23660 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
23670 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
23680 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
23690 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
236a0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
236b0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
236c0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
236d0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
236e0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
236f0 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
23700 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
23710 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
23720 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
23730 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
23740 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
23750 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
23760 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
23770 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
23780 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
23790 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
237a0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
237b0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
237c0 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
237d0 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
237e0 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
237f0 20 69 6e 74 20 6e 4c 65 61 66 3b 20 20 20 20 20   int nLeaf;     
23800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23810 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
23820 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
23830 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
23840 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
23850 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
23860 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
23870 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
23880 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
23890 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
238a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
238b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
238c0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
238d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
238e0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
238f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
23900 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 30  .    if( nLeaf<0
23910 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
23920 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23930 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
23940 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
23950 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
23960 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  <pBt->usableSize
23970 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
23980 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
23990 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
239a0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
239b0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
239c0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
239d0 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
239e0 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
239f0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
23a00 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
23a10 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
23a20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
23a30 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
23a40 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
23a50 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
23a60 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
23a70 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
23a80 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
23a90 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
23aa0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
23ab0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
23ac0 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
23ad0 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
23ae0 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
23af0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
23b00 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
23b10 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
23b20 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
23b30 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
23b40 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
23b50 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
23b60 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
23b70 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
23b80 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
23b90 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
23ba0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
23bb0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  we will contain 
23bc0 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
23bd0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
23be0 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
23bf0 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
23c00 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
23c10 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
23c20 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
23c30 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
23c40 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
23c50 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
23c60 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
23c70 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
23c80 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
23c90 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
23ca0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
23cb0 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
23cc0 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
23cd0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
23ce0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23cf0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
23d00 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
23d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23d20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
23d30 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
23d40 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
23d50 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
23d60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
23d70 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
23d80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23d90 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
23da0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
23db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23dc0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
23dd0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
23de0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  e);.        }.#e
23df0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63 20  ndif.        rc 
23e00 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
23e10 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
23e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23e30 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
23e40 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
23e50 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
23e60 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
23e70 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
23e80 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
23e90 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
23ea0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
23eb0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
23ec0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
23ed0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
23ee0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
23ef0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
23f00 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
23f10 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
23f20 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
23f30 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
23f40 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
23f50 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
23f60 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
23f70 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
23f80 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
23f90 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
23fa0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
23fb0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
23fc0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
23fd0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
23fe0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
23ff0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
24000 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
24010 20 20 28 28 21 70 50 61 67 65 29 20 26 26 20 28    ((!pPage) && (
24020 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
24030 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
24040 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
24050 65 2c 20 30 29 29 29 29 0a 20 20 20 20 20 7c 7c  e, 0)))).     ||
24060 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
24070 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24080 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 29  Page->pDbPage)))
24090 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  .  ){.    goto f
240a0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
240b0 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
240c0 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
240d0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
240e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
240f0 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
24100 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
24110 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
24120 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
24130 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
24140 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
24150 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
24160 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
24170 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
24180 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
24190 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
241a0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
241b0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
241c0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
241d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
241e0 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
241f0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
24200 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 72 65  e){.  return fre
24210 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
24220 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
24230 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pgno);.}../*.**
24240 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
24250 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
24260 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
24270 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
24280 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
24290 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
242a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
242b0 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
242c0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
242d0 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
242e0 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
242f0 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
24300 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
24310 20 75 31 36 20 6f 76 66 6c 50 61 67 65 53 69 7a   u16 ovflPageSiz
24320 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
24330 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24340 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
24350 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
24360 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
24370 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
24380 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
24390 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
243a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
243b0 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
243c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
243d0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
243e0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
243f0 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
24400 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
24410 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
24420 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
24430 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
24440 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
24450 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
24460 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
24470 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
24480 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
24490 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
244a0 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
244b0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
244c0 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
244d0 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
244e0 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
244f0 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
24500 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
24510 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
24520 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f  ovflPgno==0 || o
24530 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67  vflPgno>pagerPag
24540 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
24550 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24560 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24570 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
24580 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
24590 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
245a0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
245b0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
245c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
245d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
245e0 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65   }.    rc = free
245f0 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
24600 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
24610 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
24620 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
24630 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
24640 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
24650 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
24660 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
24670 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
24680 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24690 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
246a0 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
246b0 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
246c0 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
246d0 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
246e0 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
246f0 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
24700 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
24710 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
24720 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
24730 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
24740 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
24750 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
24760 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
24770 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
24780 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
24790 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
247a0 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
247b0 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
247c0 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
247d0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
247e0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
247f0 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
24800 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
24810 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
24820 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
24830 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
24840 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
24850 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
24860 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
24870 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
24880 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
24890 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
248a0 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
248b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
248c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
248d0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
248e0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
248f0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
24900 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
24910 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
24920 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
24930 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
24940 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
24950 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
24960 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  key */.  const v
24970 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e  oid *pData,int n
24980 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64  Data,   /* The d
24990 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ata */.  int nZe
249a0 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
249b0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
249c0 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61   zero bytes to a
249d0 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a  ppend to pData *
249e0 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a00 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
24a10 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
24a20 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
24a30 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
24a40 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
24a50 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63  , rc;.  int spac
24a60 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
24a70 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d   *pOvfl = 0;.  M
24a80 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
24a90 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  se = 0;.  unsign
24aa0 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
24ab0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
24ac0 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
24ad0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
24ae0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
24af0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
24b00 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20   int nHeader;.  
24b10 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
24b20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24b30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
24b40 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
24b50 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
24b60 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
24b70 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
24b80 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
24b90 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
24ba0 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
24bb0 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
24bc0 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
24bd0 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
24be0 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
24bf0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
24c00 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
24c10 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
24c20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
24c30 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
24c40 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
24c50 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
24c60 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
24c70 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
24c80 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61   = 0;.  if( !pPa
24c90 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
24ca0 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20  nHeader += 4;.  
24cb0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  }.  if( pPage->h
24cc0 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48  asData ){.    nH
24cd0 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
24ce0 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
24cf0 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  r], nData+nZero)
24d00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
24d10 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30  Data = nZero = 0
24d20 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
24d30 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
24d40 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
24d50 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73  u64*)&nKey);.  s
24d60 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
24d70 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
24d80 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
24d90 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
24da0 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
24db0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
24dc0 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
24dd0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
24de0 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
24df0 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
24e00 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
24e10 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
24e20 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
24e30 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
24e40 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
24e50 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
24e60 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
24e70 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
24e80 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
24e90 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66   nKey>0x7fffffff
24ea0 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20   || pKey==0 ){. 
24eb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24ec0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
24ed0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  }.    nPayload +
24ee0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
24ef0 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
24f00 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
24f10 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
24f20 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
24f30 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
24f40 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
24f50 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
24f60 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
24f70 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
24f80 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
24f90 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
24fa0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
24fb0 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
24fc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24fd0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
24fe0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
24ff0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
25000 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
25010 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
25020 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
25030 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
25040 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
25050 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
25060 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
25070 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
25080 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
25090 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
250a0 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
250b0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
250c0 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
250d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
250e0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
250f0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
25100 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
25110 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
25120 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
25130 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25140 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
25150 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
25160 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
25170 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
25180 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
25190 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
251a0 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
251b0 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
251c0 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
251d0 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
251e0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
251f0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
25200 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
25210 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
25220 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
25230 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
25240 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
25250 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
25260 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
25270 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
25280 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
25290 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
252a0 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
252b0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
252c0 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
252d0 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
252e0 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
252f0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
25300 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
25310 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
25320 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
25330 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
25340 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25350 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
25360 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
25370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25380 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
25390 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
253a0 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
253b0 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
253c0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
253d0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
253e0 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
253f0 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  map);.        if
25400 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
25410 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
25420 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
25430 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25440 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
25450 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
25460 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
25470 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
25480 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
25490 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
254a0 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
254b0 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
254c0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
254d0 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
254e0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
254f0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
25500 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
25510 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
25520 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
25530 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
25540 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
25550 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
25560 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
25570 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
25580 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
25590 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
255a0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
255b0 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
255c0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
255d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
255e0 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
255f0 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
25600 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
25610 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
25620 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
25630 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25640 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
25650 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
25660 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
25670 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
25680 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
25690 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
256a0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
256b0 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
256c0 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
256d0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
256e0 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
256f0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
25700 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
25710 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
25720 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
25730 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
25740 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
25750 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
25760 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
25770 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
25780 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
25790 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
257a0 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
257b0 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
257c0 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
257d0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
257e0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
257f0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
25800 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
25810 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
25820 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25830 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
25840 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
25850 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
25860 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
25870 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
25880 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
25890 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
258a0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
258b0 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
258c0 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
258d0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
258e0 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
258f0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
25900 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
25910 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
25920 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
25930 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
25940 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
25950 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
25960 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
25970 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
25980 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
25990 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
259a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
259b0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
259c0 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
259d0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
259e0 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
259f0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
25a00 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
25a10 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
25a20 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
25a30 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
25a40 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
25a50 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
25a60 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
25a70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
25a80 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
25a90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25aa0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
25ab0 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
25ac0 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
25ad0 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
25ae0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
25af0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
25b00 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
25b10 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
25b20 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
25b30 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
25b40 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
25b50 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
25b60 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
25b70 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
25b80 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
25b90 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
25ba0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
25bb0 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
25bc0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
25bd0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
25be0 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65 6c  atic int dropCel
25bf0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
25c00 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
25c10 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
25c20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
25c30 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
25c40 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
25c50 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
25c60 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
25c70 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
25c80 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
25c90 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
25ca0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
25cb0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
25cc0 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
25cd0 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
25ce0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
25cf0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
25d00 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
25d10 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
25d20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
25d30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
25d40 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
25d50 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
25d60 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
25d70 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
25d80 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
25d90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25da0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
25db0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
25dc0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
25dd0 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
25de0 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
25df0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78  llOffset + 2*idx
25e00 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
25e10 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20 28  te(ptr);.  if( (
25e20 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  pc<pPage->hdrOff
25e30 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
25e40 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c  af?0:4)).     ||
25e50 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70   (pc+sz>pPage->p
25e60 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20  Bt->usableSize) 
25e70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
25e80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25e90 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  T;.  }.  rc = fr
25ea0 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
25eb0 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
25ec0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25ed0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25ee0 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b  }.  for(i=idx+1;
25ef0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
25f00 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20   i++, ptr+=2){. 
25f10 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
25f20 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d  2];.    ptr[1] =
25f30 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70   ptr[3];.  }.  p
25f40 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
25f50 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
25f60 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
25f70 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
25f80 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
25f90 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72  ee += 2;.  retur
25fa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25fb0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
25fc0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
25fd0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
25fe0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
25ff0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
26000 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
26010 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
26020 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
26030 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
26040 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
26050 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
26060 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
26070 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
26080 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
26090 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
260a0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
260b0 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
260c0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
260d0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
260e0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
260f0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
26100 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
26110 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
26120 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
26130 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
26140 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
26150 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
26160 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
26170 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
26180 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
26190 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
261a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
261b0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
261c0 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
261d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
261e0 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
261f0 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
26200 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
26210 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
26220 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
26230 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
26240 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
26250 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
26260 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
26270 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
26280 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
26290 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
262a0 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
262b0 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
262c0 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
262d0 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  int insertCell(.
262e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
262f0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
26300 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
26310 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
26320 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26330 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
26340 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
26350 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
26360 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
26370 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
26380 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
26390 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
263a0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
263b0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
263c0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
263d0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
263e0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
263f0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
26400 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70  ed */.  u8 nSkip
26410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
26420 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69  not write the fi
26430 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
26440 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  of the cell */.)
26450 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  {.  int idx;    
26460 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
26470 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
26480 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
26490 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
264a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
264b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
264c0 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
264d0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
264e0 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  f content for an
264f0 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d  y cell in data[]
26500 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
26510 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
26520 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
26530 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
26540 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
26550 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
26560 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
26570 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
26580 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
26590 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
265a0 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
265b0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61  * Offset into da
265c0 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65  ta[] of the page
265d0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
265e0 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
265f0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
26600 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
26610 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
26620 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
26630 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
26640 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
26650 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
26660 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
26670 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
26680 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
26690 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
266a0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
266b0 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
266c0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
266d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
266e0 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
266f0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
26700 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
26710 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20  >pBt)<=5460 );. 
26720 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
26730 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
26740 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66  Size(pPage->aOvf
26750 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
26760 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
26770 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b  pPage, pCell) );
26780 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26790 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
267a0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
267b0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
267c0 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
267d0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
267e0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
267f0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
26800 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
26810 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
26820 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
26830 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
26840 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
26850 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
26860 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
26870 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
26880 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
26890 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29  ge->aOvfl[0])) )
268a0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
268b0 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
268c0 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
268d0 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28  aOvfl[j].idx = (
268e0 75 31 36 29 69 3b 0a 20 20 20 20 70 50 61 67 65  u16)i;.    pPage
268f0 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
26900 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
26910 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26920 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
26930 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
26940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26950 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26960 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
26970 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
26980 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
26990 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
269a0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
269b0 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20  Data;.    hdr = 
269c0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
269d0 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
269e0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
269f0 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ]);.    cellOffs
26a00 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
26a10 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
26a20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
26a30 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20  *pPage->nCell + 
26a40 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  2;.    ins = cel
26a50 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
26a60 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70     if( end > top
26a70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72   - sz ){.      r
26a80 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
26a90 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
26aa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26ab0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
26ac0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
26ad0 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74  .      top = get
26ae0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
26af0 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  5]);.      asser
26b00 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74  t( end + sz <= t
26b10 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op );.    }.    
26b20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  idx = allocateSp
26b30 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a  ace(pPage, sz);.
26b40 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e      assert( idx>
26b50 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
26b60 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65   end <= get2byte
26b70 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
26b80 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b 73 7a  ;.    if (idx+sz
26b90 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
26ba0 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20 20  sableSize) {.   
26bb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26bc0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
26bd0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
26be0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
26bf0 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a  ge->nFree -= 2;.
26c00 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
26c10 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
26c20 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
26c30 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65  ip);.    for(j=e
26c40 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b  nd-2, ptr=&data[
26c50 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
26c60 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
26c70 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
26c80 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
26c90 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
26ca0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
26cb0 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
26cc0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
26cd0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
26ce0 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  >nCell);.#ifndef
26cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26d00 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
26d10 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
26d20 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
26d30 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
26d40 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
26d50 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
26d60 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
26d70 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
26d80 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
26d90 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
26da0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
26db0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
26dc0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
26dd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
26de0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
26df0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
26e00 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nfo);.      asse
26e10 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
26e20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
26e30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
26e40 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
26e50 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e       if( (info.n
26e60 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
26e70 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
26e80 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  )>info.nLocal ){
26e90 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67  .        Pgno pg
26ea0 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
26eb0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
26ec0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
26ed0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
26ee0 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  t(pPage->pBt, pg
26ef0 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
26f00 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
26f10 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
26f20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26f30 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
26f40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
26f50 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
26f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26f70 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
26f80 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
26f90 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
26fa0 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
26fb0 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
26fc0 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
26fd0 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
26fe0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
26ff0 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
27000 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
27010 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
27020 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
27030 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
27040 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
27050 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
27060 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
27070 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
27080 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
27090 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
270a0 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
270b0 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20   u16 *aSize     
270c0 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
270d0 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
270e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
270f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
27100 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61  er */.  int tota
27110 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74  lSize;    /* Tot
27120 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
27130 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64  ells */.  int hd
27140 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r;          /* I
27150 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68 65 61  ndex of page hea
27160 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
27170 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64  lptr;      /* Ad
27180 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
27190 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
271a0 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
271b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
271c0 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
271d0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
271e0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
271f0 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  r the page */.. 
27200 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
27210 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
27220 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27230 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
27240 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
27250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
27260 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
27270 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
27280 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
27290 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
272a0 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20   );.  totalSize 
272b0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
272c0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
272d0 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20     totalSize += 
272e0 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20  aSize[i];.  }.  
272f0 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a  assert( totalSiz
27300 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  e+2*nCell<=pPage
27310 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73  ->nFree );.  ass
27320 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
27330 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
27340 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
27350 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
27360 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 63  >pDbPage) );.  c
27370 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e  ellptr = pPage->
27380 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61  cellOffset;.  da
27390 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
273a0 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
273b0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70  ->hdrOffset;.  p
273c0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
273d0 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
273e0 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  if( nCell ){.   
273f0 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f   cellbody = allo
27400 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
27410 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20   totalSize);.   
27420 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
27430 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  y>0 );.    asser
27440 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t( pPage->nFree 
27450 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  >= 2*nCell );.  
27460 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
27470 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66  = 2*nCell;.    f
27480 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
27490 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74   i++){.      put
274a0 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
274b0 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  ptr], cellbody);
274c0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64  .      memcpy(&d
274d0 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61  ata[cellbody], a
274e0 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b  pCell[i], aSize[
274f0 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70  i]);.      cellp
27500 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63  tr += 2;.      c
27510 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65  ellbody += aSize
27520 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  [i];.    }.    a
27530 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d  ssert( cellbody=
27540 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
27550 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20  bleSize );.  }. 
27560 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
27570 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  (u16)nCell;.}../
27580 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
27590 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
275a0 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
275b0 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
275c0 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
275d0 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
275e0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
275f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
27600 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
27610 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
27620 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
27630 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
27640 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
27650 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
27660 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
27670 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
27680 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
27690 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
276a0 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
276b0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
276c0 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
276d0 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
276e0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
276f0 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
27700 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
27710 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
27720 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
27730 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
27740 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
27750 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
27760 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
27770 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
27780 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
27790 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
277a0 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
277b0 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
277c0 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
277d0 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
277e0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27800 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
27810 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
27820 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
27830 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
27840 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
27850 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
27860 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
27870 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
27880 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
27890 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
278a0 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29 3b 0a 0a  Cursor*, int);..
278b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
278c0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
278d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
278e0 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
278f0 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
27900 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
27910 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
27920 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
27930 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
27940 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
27950 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
27960 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
27970 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
27980 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
27990 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
279a0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
279b0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
279c0 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63  of trying balanc
279d0 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
279e0 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
279f0 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
27a00 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
27a10 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
27a20 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
27a30 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
27a40 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
27a50 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
27a60 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
27a70 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
27a80 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
27a90 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
27aa0 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
27ab0 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
27ac0 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
27ad0 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
27ae0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
27af0 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
27b00 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
27b10 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
27b20 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
27b30 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
27b40 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
27b50 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
27b60 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
27b70 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
27b80 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
27b90 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
27ba0 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
27bb0 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
27bc0 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
27bd0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
27be0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
27bf0 6b 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  k(BtCursor *pCur
27c00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
27c10 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30  emPage *pNew = 0
27c20 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  ;.  Pgno pgnoNew
27c30 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  ;.  u8 *pCell;. 
27c40 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43   u16 szCell;.  C
27c50 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
27c60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
27c70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27c80 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 4d 65  ur->iPage];.  Me
27c90 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d  mPage *pParent =
27ca0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27cb0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
27cc0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
27cd0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
27ce0 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50  t parentIdx = pP
27cf0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20  arent->nCell;   
27d00 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64  /* pParent new d
27d10 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65  ivider cell inde
27d20 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e  x */.  int paren
27d30 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
27d40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
27d50 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20   of new divider 
27d60 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72  cell */.  u8 par
27d70 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20  entCell[64];    
27d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27d90 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
27da0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
27db0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
27dc0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
27dd0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
27de0 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ) );..  /* Alloc
27df0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
27e00 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66  Insert the overf
27e10 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
27e20 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74  age.  ** into it
27e30 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  . Then remove th
27e40 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
27e50 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f  from pPage..  */
27e60 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
27e70 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
27e80 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
27e90 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
27ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27eb0 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    pCell = pPage-
27ec0 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
27ed0 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65  .    szCell = ce
27ee0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
27ef0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73   pCell);.    ass
27f00 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
27f10 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65  rIswriteable(pNe
27f20 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  w->pDbPage) );. 
27f30 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
27f40 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
27f50 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  ]);.    assemble
27f60 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
27f70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
27f80 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
27f90 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a 20 20 20  flow = 0;.  .   
27fa0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75 72   /* pPage is cur
27fb0 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74  rently the right
27fc0 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e  -child of pParen
27fd0 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20  t. Change this. 
27fe0 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68     ** so that th
27ff0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73  e right-child is
28000 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c   the new page al
28010 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e  located above an
28020 64 0a 20 20 20 20 2a 2a 20 70 50 61 67 65 20 69  d.    ** pPage i
28030 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69  s the next-to-ri
28040 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 20 20  ght child. .    
28050 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e 6f 72 65  **.    ** Ignore
28060 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
28070 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  e of the call to
28080 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20 66   fillInCell(). f
28090 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20 20 20  illInCell().    
280a0 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65 74 75  ** may only retu
280b0 72 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  rn other than SQ
280c0 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20 69 73  LITE_OK if it is
280d0 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 6c   required to all
280e0 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20 6f 6e 65  ocate.    ** one
280f0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
28100 77 20 70 61 67 65 73 2e 20 53 69 6e 63 65 20 61  w pages. Since a
28110 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61 62 6c 65  n internal table
28120 20 42 2d 54 72 65 65 20 63 65 6c 6c 20 0a 20 20   B-Tree cell .  
28130 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65 72 20 73    ** may never s
28140 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f 20 61  pill over onto a
28150 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
28160 28 69 74 20 69 73 20 61 20 6d 61 78 69 6d 75 6d  (it is a maximum
28170 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31 33 20 62   of .    ** 13 b
28180 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c 20 69  ytes in size), i
28190 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65 73 73  t is not neccess
281a0 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68 65  ary to check the
281b0 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 20 20   return code..  
281c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69    **.    ** Simi
281d0 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e 73 65 72  larly, the inser
281e0 74 43 65 6c 6c 28 29 20 66 75 6e 63 74 69 6f 6e  tCell() function
281f0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 66 20   cannot fail if 
28200 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  the page.    ** 
28210 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 69  being inserted i
28220 6e 74 6f 20 69 73 20 61 6c 72 65 61 64 79 20 77  nto is already w
28230 72 69 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ritable and the 
28240 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 0a 20  cell does not . 
28250 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e     ** contain an
28260 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e 74 65   overflow pointe
28270 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 69  r. So ignore thi
28280 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  s return code to
28290 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  o..    */.    as
282a0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
282b0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70 43 65 6c  ll>0 );.    pCel
282c0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
282d0 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
282e0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
282f0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
28300 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
28310 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66 69 6c 6c  &info);.    fill
28320 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
28330 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69  parentCell, 0, i
28340 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
28350 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b  0, &parentSize);
28360 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 72  .    assert( par
28370 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20  entSize<64 );.  
28380 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
28390 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
283a0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
283b0 67 65 29 20 29 3b 0a 20 20 20 20 69 6e 73 65 72  ge) );.    inser
283c0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
283d0 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74  arentIdx, parent
283e0 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65  Cell, parentSize
283f0 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70 75 74  , 0, 4);.    put
28400 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
28410 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70  owCell(pParent,p
28420 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65  arentIdx), pPage
28430 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74  ->pgno);.    put
28440 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
28450 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
28460 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
28470 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
28480 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
28490 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
284a0 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
284b0 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
284c0 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
284d0 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
284e0 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
284f0 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
28500 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
28510 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
28520 6f 77 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ow page..    */.
28530 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
28540 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
28550 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
28560 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
28570 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
28580 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
28590 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
285a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
285b0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
285c0 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  New, 0);.      }
285d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
285e0 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
285f0 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
28600 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
28610 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
28620 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
28630 73 20 70 6f 69 6e 74 20 74 68 65 20 70 50 61 67  s point the pPag
28640 65 2d 3e 6e 46 72 65 65 20 76 61 72 69 61 62 6c  e->nFree variabl
28650 65 20 69 73 20 6e 6f 74 20 73 65 74 20 63 6f 72  e is not set cor
28660 72 65 63 74 6c 79 20 77 69 74 68 0a 20 20 2a 2a  rectly with.  **
28670 20 72 65 73 70 65 63 74 20 74 6f 20 74 68 65 20   respect to the 
28680 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
28690 61 67 65 20 28 62 65 63 61 75 73 65 20 69 74 20  age (because it 
286a0 77 61 73 20 73 65 74 20 74 6f 20 30 20 62 79 20  was set to 0 by 
286b0 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c  .  ** insertCell
286c0 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ). So call sqlit
286d0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
286e0 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69  ) to make sure i
286f0 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72 72 65 63  t is.  ** correc
28700 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  t..  **.  ** Thi
28710 73 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65  s has to be done
28720 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
28730 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
28740 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  ed. Normally, if
28750 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
28760 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 72 65  ccurs during tre
28770 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65  e balancing, the
28780 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d   contents of Mem
28790 50 61 67 65 20 61 72 65 0a 20 20 2a 2a 20 6e 6f  Page are.  ** no
287a0 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20 61 73 20  t important, as 
287b0 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63  they will be rec
287c0 61 6c 63 75 6c 61 74 65 64 20 77 68 65 6e 20 74  alculated when t
287d0 68 65 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65  he page is rolle
287e0 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 42 75 74  d.  ** back. But
287f0 20 68 65 72 65 2c 20 69 6e 20 62 61 6c 61 6e 63   here, in balanc
28800 65 5f 71 75 69 63 6b 28 29 2c 20 69 74 20 69 73  e_quick(), it is
28810 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
28820 50 61 67 65 20 68 61 73 20 0a 20 20 2a 2a 20 6e  Page has .  ** n
28830 6f 74 20 79 65 74 20 62 65 65 6e 20 6d 61 72 6b  ot yet been mark
28840 65 64 20 64 69 72 74 79 20 6f 72 20 77 72 69 74  ed dirty or writ
28850 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
28860 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
28870 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 77 69 6c  fore.  ** it wil
28880 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  l not be rolled 
28890 62 61 63 6b 20 61 6e 64 20 73 6f 20 69 74 20 69  back and so it i
288a0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6d  s important to m
288b0 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
288c0 2a 2a 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ** the page data
288d0 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73 20 6f 66   and contents of
288e0 20 4d 65 6d 50 61 67 65 20 61 72 65 20 63 6f 6e   MemPage are con
288f0 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
28900 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
28910 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
28920 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
28930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
28940 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
28950 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65 72  );..  /* If ever
28960 79 74 68 69 6e 67 20 65 6c 73 65 20 73 75 63 63  ything else succ
28970 65 65 64 65 64 2c 20 62 61 6c 61 6e 63 65 20 74  eeded, balance t
28980 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
28990 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65 20 74 68  in .  ** case th
289a0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  e divider cell i
289b0 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69  nserted caused i
289c0 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72  t to become over
289d0 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  full..  */.  if(
289e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
289f0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
28a00 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  e(pPage);.    pC
28a10 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20  ur->iPage--;.   
28a20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43   rc = balance(pC
28a30 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  ur, 0);.  }.  re
28a40 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
28a50 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
28a60 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f  _QUICKBALANCE */
28a70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28a80 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74  tine redistribut
28a90 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67  es Cells on pPag
28aa0 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32  e and up to NN*2
28ab0 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20   siblings.** of 
28ac0 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c  pPage so that al
28ad0 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
28ae0 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75  ut the same amou
28af0 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
28b00 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20  ..** Usually NN 
28b10 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
28b20 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
28b30 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20   is used in the 
28b40 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68  balancing,.** th
28b50 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e  ough more siblin
28b60 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72  gs might come fr
28b70 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70  om one side if p
28b80 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  Page is the firs
28b90 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69  t.** or last chi
28ba0 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74  ld of its parent
28bb0 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73 20  .  If pPage has 
28bc0 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20  fewer than 2*NN 
28bd0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d  siblings.** (som
28be0 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e  ething which can
28bf0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
28c00 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f  pPage is the roo
28c10 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20  t page or a .** 
28c20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74  child of root) t
28c30 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
28c40 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69  e siblings parti
28c50 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
28c60 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
28c70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
28c80 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d  lings of pPage m
28c90 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
28ca0 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  d or decreased b
28cb0 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20  y one or.** two 
28cc0 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
28cd0 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
28ce0 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
28cf0 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f  ver full. The ro
28d00 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70  ot page.** is sp
28d10 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c  ecial and is all
28d20 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c  owed to be nearl
28d30 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67  y empty. If pPag
28d40 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f  e is .** the roo
28d50 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
28d60 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72   depth of the tr
28d70 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ee might be incr
28d80 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72  eased.** or decr
28d90 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73  eased by one, as
28da0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b   necessary, to k
28db0 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67  eep the root pag
28dc0 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  e from being.** 
28dd0 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70  overfull or comp
28de0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  letely empty..**
28df0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
28e00 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
28e10 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
28e20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20  of the Cells on 
28e30 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e  pPage.** might n
28e40 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
28e50 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e  tored in pPage->
28e60 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63  aData[].  This c
28e70 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
28e80 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
28e90 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74  full.  Part of t
28ea0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
28eb0 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20  outine is to.** 
28ec0 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65  make sure all Ce
28ed0 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e  lls for pPage on
28ee0 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20  ce again fit in 
28ef0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a  pPage->aData[]..
28f00 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75  **.** In the cou
28f10 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67  rse of balancing
28f20 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66   the siblings of
28f30 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72 65   pPage, the pare
28f40 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d  nt of pPage.** m
28f50 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72  ight become over
28f60 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
28f70 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70 70  l.  If that happ
28f80 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ens, then this r
28f90 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
28fa0 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
28fb0 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a  on the parent..*
28fc0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
28fd0 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
28fe0 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
28ff0 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
29000 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
29010 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
29020 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
29030 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
29040 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
29050 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
29060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29070 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
29080 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
29090 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
290a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
290b0 2f 2a 20 54 68 65 20 6f 76 65 72 20 6f 72 20 75  /* The over or u
290c0 6e 64 65 72 66 75 6c 6c 20 70 61 67 65 20 74 6f  nderfull page to
290d0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 4d 65   balance */.  Me
290e0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20  mPage *pParent; 
290f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29100 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
29110 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
29120 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
29130 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65      /* The whole
29140 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
29150 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20  nt nCell = 0;   
29160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29170 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
29180 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
29190 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  int nMaxCells = 
291a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
291b0 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
291c0 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  f apCell, szCell
291d0 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e  , aFrom. */.  in
291e0 74 20 6e 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20  t nOld = 0;     
291f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29200 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
29210 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e   apOld[] */.  in
29220 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20  t nNew = 0;     
29230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29240 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
29250 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e   apNew[] */.  in
29260 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20  t nDiv;         
29270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29280 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
29290 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e   apDiv[] */.  in
292a0 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20  t i, j, k;      
292b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
292c0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
292d0 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
292f0 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20   Index of pPage 
29300 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
29310 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  l[] */.  int nxD
29320 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
29330 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
29340 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
29350 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
29360 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29380 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
29390 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  ode */.  int lea
293a0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
293b0 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
293c0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
293d0 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
293e0 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
293f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29400 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
29410 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
29420 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
29430 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
29440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
29450 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
29460 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
29470 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
29480 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
29490 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
294a0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
294b0 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
294d0 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
294e0 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
294f0 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
29500 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
29510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29520 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
29530 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
29540 20 20 69 6e 74 20 69 53 70 61 63 65 32 20 3d 20    int iSpace2 = 
29550 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
29560 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
29570 79 74 65 20 6f 66 20 61 53 70 61 63 65 32 5b 5d  yte of aSpace2[]
29580 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
29590 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
295a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
295b0 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
295c0 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
295d0 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
295e0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
295f0 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
29600 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67  siblings */.  Pg
29610 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20  no pgnoOld[NB]; 
29620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
29630 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65  ge numbers for e
29640 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c  ach page in apOl
29650 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  d[] */.  MemPage
29660 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
29670 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
29680 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
29690 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
296a0 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
296b0 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
296c0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
296d0 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
296e0 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50  balancing */.  P
296f0 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32  gno pgnoNew[NB+2
29700 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ];          /* P
29710 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
29720 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e  each page in apN
29730 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70  ew[] */.  u8 *ap
29740 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Div[NB];        
29750 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
29760 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
29770 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
29780 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
29790 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
297a0 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
297b0 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
297c0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
297d0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
297e0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
297f0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
29800 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
29810 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
29820 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
29830 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
29840 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
29850 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29870 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
29880 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
29890 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
298a0 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  aCopy[NB];      
298b0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
298c0 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20  holding data of 
298d0 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38  apCopy[] */.  u8
298e0 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
298f0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
29900 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  r copies of divi
29910 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66 6f 72  ders cells befor
29920 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75  e balance */.  u
29930 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30 3b 20  8 *aSpace2 = 0; 
29940 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
29950 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69 76 69  or overflow divi
29960 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74 65 72  ders cells after
29970 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38   balance */.  u8
29980 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20 20   *aFrom = 0;..  
29990 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
299a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
299b0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ];.  assert( sql
299c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
299d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
299e0 78 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  x) );.  VVA_ONLY
299f0 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75  ( pCur->pagesShu
29a00 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 0a 20 20  ffled = 1 );..  
29a10 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68  /* .  ** Find th
29a20 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
29a30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
29a40 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
29a50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29a60 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
29a70 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
29a80 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
29a90 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20 70  e->pDbPage) || p
29aa0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
29ab0 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  =1 );.  pBt = pP
29ac0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72  age->pBt;.  pPar
29ad0 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  ent = pCur->apPa
29ae0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
29af0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
29b00 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51  rent );.  if( SQ
29b10 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
29b20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29b30 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
29b40 65 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  e)) ){.    goto 
29b50 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
29b60 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 28 28 22  .  }..  TRACE(("
29b70 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
29b80 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
29b90 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
29ba0 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
29bb0 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  o));..#ifndef SQ
29bc0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
29bd0 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  ALANCE.  /*.  **
29be0 20 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a   A special case:
29bf0 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79    If a new entry
29c00 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69   has just been i
29c10 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20  nserted into a. 
29c20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20   ** table (that 
29c30 69 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68  is, a btree with
29c40 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e   integer keys an
29c50 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68  d all data at th
29c60 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61  e leaves).  ** a
29c70 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  nd the new entry
29c80 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
29c90 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
29ca0 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65  tree (it has the
29cb0 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65  .  ** largest ke
29cc0 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  y) then use the 
29cd0 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f  special balance_
29ce0 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  quick() routine 
29cf0 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69  for.  ** balanci
29d00 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69  ng.  balance_qui
29d10 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73  ck() is much fas
29d20 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20  ter and results 
29d30 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a  in a tighter.  *
29d40 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74  * packing of dat
29d50 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  a in the common 
29d60 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
29d70 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a   pPage->leaf &&.
29d80 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
29d90 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61  Key &&.      pPa
29da0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
29db0 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
29dc0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
29dd0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20  Page->nCell &&. 
29de0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 67       pParent->pg
29df0 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67  no!=1 &&.      g
29e00 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
29e10 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
29e20 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
29e30 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b  pPage->pgno.  ){
29e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
29e50 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
29e60 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    /*.    ** TODO
29e70 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c  : Check the sibl
29e80 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ings to the left
29e90 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61   of pPage. It ma
29ea0 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  y be that.    **
29eb0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75   they are not fu
29ec0 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61  ll and no new pa
29ed0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ge is required..
29ee0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
29ef0 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  n balance_quick(
29f00 70 43 75 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pCur);.  }.#endi
29f10 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  f..  if( SQLITE_
29f20 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
29f30 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
29f40 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  e->pDbPage)) ){.
29f50 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
29f60 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
29f70 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
29f80 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
29f90 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20  rent page whose 
29fa0 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  left child point
29fb0 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70  s back.  ** to p
29fc0 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22  Page.  The "idx"
29fd0 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
29fe0 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
29ff0 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20  ell.  If pPage. 
2a000 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74   ** is the right
2a010 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
2a020 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69  arent then set i
2a030 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e  dx to pParent->n
2a040 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 64 78  Cell .  */.  idx
2a050 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2a060 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20  Cur->iPage-1];. 
2a070 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
2a080 65 78 28 70 50 61 72 65 6e 74 2c 20 69 64 78 2c  ex(pParent, idx,
2a090 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a   pPage->pgno);..
2a0a0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73    /*.  ** Find s
2a0b0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
2a0c0 70 50 61 67 65 20 61 6e 64 20 74 68 65 20 63 65  pPage and the ce
2a0d0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74  lls in pParent t
2a0e0 68 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20  hat divide.  ** 
2a0f0 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41  the siblings.  A
2a100 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
2a110 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
2a120 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a  lings on either.
2a130 20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61    ** side of pPa
2a140 67 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e  ge.  More siblin
2a150 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
2a160 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
2a170 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61  ver, if.  ** pPa
2a180 67 65 20 74 68 65 72 65 20 61 72 65 20 66 65 77  ge there are few
2a190 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69  er than NN sibli
2a1a0 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  ngs on the other
2a1b0 20 73 69 64 65 2e 20 20 49 66 20 70 50 61 72 65   side.  If pPare
2a1c0 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
2a1d0 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
2a1e0 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
2a1f0 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
2a200 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20  e taken..  */.  
2a210 6e 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e  nxDiv = idx - NN
2a220 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20  ;.  if( nxDiv + 
2a230 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43  NB > pParent->nC
2a240 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  ell ){.    nxDiv
2a250 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
2a260 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a  l - NB + 1;.  }.
2a270 20 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b    if( nxDiv<0 ){
2a280 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a  .    nxDiv = 0;.
2a290 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a    }.  nDiv = 0;.
2a2a0 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44    for(i=0, k=nxD
2a2b0 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b  iv; i<NB; i++, k
2a2c0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70  ++){.    if( k<p
2a2d0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
2a2e0 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
2a2f0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
2a300 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44  nt, k);.      nD
2a310 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  iv++;.      asse
2a320 72 74 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65  rt( !pParent->le
2a330 61 66 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  af );.      pgno
2a340 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
2a350 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
2a360 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50   }else if( k==pP
2a370 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
2a380 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
2a390 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2a3a0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2a3b0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2a3c0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2a3d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a3e0 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  }.    rc = getAn
2a3f0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
2a400 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c  gnoOld[i], &apOl
2a410 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
2a420 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
2a430 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 2f 2a  _cleanup;.    /*
2a440 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61   apOld[i]->idxPa
2a450 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f 0a 20 20 20  rent = k; */.   
2a460 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a   apCopy[i] = 0;.
2a470 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
2a480 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b  Old );.    nOld+
2a490 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73  +;.    nMaxCells
2a4a0 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
2a4b0 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
2a4c0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a  nOverflow;.  }..
2a4d0 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
2a4e0 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
2a4f0 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
2a500 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
2a510 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
2a520 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
2a530 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
2a540 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
2a550 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
2a560 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
2a570 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72  res.  */.  szScr
2a580 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d  atch =.       nM
2a590 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2a5a0 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
2a5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
2a5c0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
2a5d0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2a5e0 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
2a5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
2a600 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52  ell */.     + (R
2a610 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
2a620 50 61 67 65 29 29 2b 70 42 74 2d 3e 70 61 67 65  Page))+pBt->page
2a630 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f  Size)*NB  /* aCo
2a640 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  py */.     + pBt
2a650 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a670 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
2a680 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49  ce1 */.     + (I
2a690 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d  SAUTOVACUUM ? nM
2a6a0 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20  axCells : 0);   
2a6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72            /* aFr
2a6c0 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  om */.  apCell =
2a6d0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
2a6e0 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68  alloc( szScratch
2a6f0 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c   ); .  if( apCel
2a700 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
2a710 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2a720 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2a730 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
2a740 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
2a750 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
2a760 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28  ;.  aCopy[0] = (
2a770 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
2a780 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
2a790 28 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28  ( ((aCopy[0] - (
2a7a0 75 38 2a 29 30 29 20 26 20 37 29 3d 3d 30 20 29  u8*)0) & 7)==0 )
2a7b0 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
2a7c0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
2a7d0 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  /.  for(i=1; i<N
2a7e0 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f  B; i++){.    aCo
2a7f0 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69  py[i] = &aCopy[i
2a800 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
2a810 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
2a820 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20  MemPage))];.    
2a830 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
2a840 69 5d 20 2d 20 28 75 38 2a 29 30 29 20 26 20 37  i] - (u8*)0) & 7
2a850 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
2a860 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
2a870 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53  ired */.  }.  aS
2a880 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79 5b 4e  pace1 = &aCopy[N
2a890 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  B-1][pBt->pageSi
2a8a0 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
2a8b0 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61  (MemPage))];.  a
2a8c0 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65 31  ssert( ((aSpace1
2a8d0 20 2d 20 28 75 38 2a 29 30 29 20 26 20 37 29 3d   - (u8*)0) & 7)=
2a8e0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
2a8f0 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
2a900 65 64 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  ed */.  if( ISAU
2a910 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2a920 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 31  aFrom = &aSpace1
2a930 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b  [pBt->pageSize];
2a940 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 32 20 3d  .  }.  aSpace2 =
2a950 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
2a960 6f 63 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  oc(pBt->pageSize
2a970 29 3b 0a 20 20 69 66 28 20 61 53 70 61 63 65 32  );.  if( aSpace2
2a980 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2a990 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2a9a0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2a9b0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a 20  leanup;.  }.  . 
2a9c0 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f   /*.  ** Make co
2a9d0 70 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74  pies of the cont
2a9e0 65 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64  ent of pPage and
2a9f0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e   its siblings in
2aa00 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20  to aOld[]..  ** 
2aa10 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  The rest of this
2aa20 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75   function will u
2aa30 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  se data from the
2aa40 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20   copies rather. 
2aa50 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
2aa60 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
2aa70 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
2aa80 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
2aa90 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  the.  ** process
2aaa0 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72   of being overwr
2aab0 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  itten..  */.  fo
2aac0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
2aad0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
2aae0 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20   *p = apCopy[i] 
2aaf0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70  = (MemPage*)aCop
2ab00 79 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  y[i];.    memcpy
2ab10 28 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  (p, apOld[i], si
2ab20 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
2ab30 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28      p->aData = (
2ab40 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20  void*)&p[1];.   
2ab50 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61   memcpy(p->aData
2ab60 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
2ab70 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
2ab80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
2ab90 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
2aba0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
2abb0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
2abc0 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
2abd0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
2abe0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
2abf0 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
2ac00 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
2ac10 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
2ac20 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
2ac30 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 31 5b  ed form aSpace1[
2ac40 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
2ac50 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c   the divider Cel
2ac60 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61  ls.  ** from pPa
2ac70 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
2ac80 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
2ac90 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
2aca0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
2acb0 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
2acc0 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
2acd0 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
2ace0 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
2acf0 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
2ad00 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
2ad10 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e  o aSpace1[].  In
2ad20 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63   this way, all c
2ad30 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
2ad40 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a   are without.  *
2ad50 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  * child pointers
2ad60 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61  .  If siblings a
2ad70 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
2ad80 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a  hen all cell in.
2ad90 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e    ** apCell[] in
2ada0 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e  clude child poin
2adb0 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61  ters.  Either wa
2adc0 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
2add0 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72  apCell[].  ** ar
2ade0 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20  e alike..  **.  
2adf0 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ** leafCorrectio
2ae00 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69  n:  4 if pPage i
2ae10 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
2ae20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c  pPage is not a l
2ae30 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  eaf..  **       
2ae40 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20  leafData:  1 if 
2ae50 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b  pPage holds key+
2ae60 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74  data and pParent
2ae70 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73   holds only keys
2ae80 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d  ..  */.  nCell =
2ae90 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63   0;.  leafCorrec
2aea0 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65  tion = pPage->le
2aeb0 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61  af*4;.  leafData
2aec0 20 3d 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74   = pPage->hasDat
2aed0 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
2aee0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
2aef0 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
2af00 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69  apCopy[i];.    i
2af10 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d  nt limit = pOld-
2af20 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
2af30 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28  erflow;.    for(
2af40 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b  j=0; j<limit; j+
2af50 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
2af60 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
2af70 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c  s );.      apCel
2af80 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f  l[nCell] = findO
2af90 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64  verflowCell(pOld
2afa0 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  , j);.      szCe
2afb0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
2afc0 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
2afd0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
2afe0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2aff0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
2b000 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61  int a;.        a
2b010 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 28 75  From[nCell] = (u
2b020 38 29 69 3b 20 20 20 61 73 73 65 72 74 28 20 69  8)i;   assert( i
2b030 3e 3d 30 20 26 26 20 69 3c 36 20 29 3b 0a 20 20  >=0 && i<6 );.  
2b040 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61        for(a=0; a
2b050 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  <pOld->nOverflow
2b060 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; a++){.        
2b070 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66    if( pOld->aOvf
2b080 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65  l[a].pCell==apCe
2b090 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20  ll[nCell] ){.   
2b0a0 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e           aFrom[n
2b0b0 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20  Cell] = 0xFF;.  
2b0c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2b0d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2b0f0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
2b100 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
2b110 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 75 31  ld-1 ){.      u1
2b120 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  6 sz = cellSizeP
2b130 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
2b140 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
2b150 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
2b160 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
2b170 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
2b180 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
2b190 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
2b1a0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2b1b0 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
2b1c0 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
2b1d0 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
2b1e0 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
2b1f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
2b200 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
2b210 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
2b220 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
2b230 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
2b240 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
2b250 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
2b260 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
2b270 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
2b280 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2b290 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2b2a0 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
2b2b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b2c0 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
2b2d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2b2e0 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
2b2f0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
2b300 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
2b310 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
2b320 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
2b330 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  1];.        iSpa
2b340 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ce1 += sz;.     
2b350 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
2b360 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
2b370 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2b380 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e  ( iSpace1<=pBt->
2b390 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
2b3a0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
2b3b0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
2b3c0 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
2b3d0 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c  nCell] = pTemp+l
2b3e0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
2b3f0 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54         if( ISAUT
2b400 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2b410 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
2b420 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ] = 0xFF;.      
2b430 20 20 7d 0a 20 20 20 20 20 20 20 20 64 72 6f 70    }.        drop
2b440 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
2b450 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
2b460 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2b470 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c  rrection==0 || l
2b480 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
2b490 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65   );.        szCe
2b4a0 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 28 75 31  ll[nCell] -= (u1
2b4b0 36 29 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6)leafCorrection
2b4c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2b4d0 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d 70  ( get4byte(pTemp
2b4e0 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b  )==pgnoOld[i] );
2b4f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4f  .        if( !pO
2b500 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
2b510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2b520 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2b530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
2b540 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
2b550 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
2b560 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
2b570 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
2b580 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
2b590 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
2b5a0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ll */.          
2b5b0 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43  memcpy(apCell[nC
2b5c0 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61  ell], &pOld->aDa
2b5d0 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73  ta[pOld->hdrOffs
2b5e0 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20  et+8], 4);.     
2b5f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b600 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
2b610 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
2b620 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2b630 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
2b640 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2b650 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e   Do not allow an
2b660 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20  y cells smaller 
2b670 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f  than 4 bytes. */
2b680 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43  .            szC
2b690 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a  ell[nCell] = 4;.
2b6a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43      }.        nC
2b6c0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ell++;.      }. 
2b6d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
2b6e0 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   ** Figure out t
2b6f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
2b700 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  es needed to hol
2b710 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c  d all nCell cell
2b720 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68  s..  ** Store th
2b730 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22  is number in "k"
2b740 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20  .  Also compute 
2b750 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  szNew[] which is
2b760 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20   the total.  ** 
2b770 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
2b780 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61  s on the i-th pa
2b790 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20  ge and cntNew[] 
2b7a0 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64  which is the ind
2b7b0 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c  ex.  ** in apCel
2b7c0 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  l[] of the cell 
2b7d0 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67  that divides pag
2b7e0 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b  e i from page i+
2b7f0 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77  1.  .  ** cntNew
2b800 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c  [k] should equal
2b810 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a   nCell..  **.  *
2b820 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65  * Values compute
2b830 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a  d by this block:
2b840 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
2b850 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61       k: The tota
2b860 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  l number of sibl
2b870 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20  ing pages.  **  
2b880 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63    szNew[i]: Spac
2b890 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69  ed used on the i
2b8a0 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
2b8b0 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b  ..  **   cntNew[
2b8c0 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43  i]: Index in apC
2b8d0 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c  ell[] and szCell
2b8e0 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  [] for the first
2b8f0 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20   cell to.  **   
2b900 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72             the r
2b910 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68  ight of the i-th
2b920 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
2b930 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a   ** usableSpace:
2b940 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2b950 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61   of space availa
2b960 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c  ble on each sibl
2b970 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a  ing..  ** .  */.
2b980 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20    usableSpace = 
2b990 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2b9a0 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65  - 12 + leafCorre
2b9b0 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62  ction;.  for(sub
2b9c0 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e  total=k=i=0; i<n
2b9d0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2b9e0 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65  assert( i<nMaxCe
2b9f0 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f  lls );.    subto
2ba00 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d  tal += szCell[i]
2ba10 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75   + 2;.    if( su
2ba20 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53  btotal > usableS
2ba30 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a  pace ){.      sz
2ba40 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
2ba50 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20  l - szCell[i];. 
2ba60 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d       cntNew[k] =
2ba70 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65   i;.      if( le
2ba80 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d  afData ){ i--; }
2ba90 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20  .      subtotal 
2baa0 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a  = 0;.      k++;.
2bab0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
2bac0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
2bad0 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
2bae0 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
2baf0 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
2bb00 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
2bb10 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
2bb20 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
2bb30 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
2bb40 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
2bb50 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
2bb60 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
2bb70 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
2bb80 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
2bb90 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
2bba0 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
2bbb0 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
2bbc0 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
2bbd0 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
2bbe0 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
2bbf0 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
2bc00 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
2bc10 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
2bc20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
2bc30 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
2bc40 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2bc50 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
2bc60 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
2bc70 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
2bc80 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
2bc90 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
2bca0 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
2bcb0 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
2bcc0 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
2bcd0 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
2bce0 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
2bcf0 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
2bd00 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
2bd10 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
2bd20 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
2bd30 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
2bd40 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
2bd50 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
2bd60 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
2bd70 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
2bd80 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
2bd90 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
2bda0 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
2bdb0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
2bdc0 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
2bdd0 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
2bde0 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
2bdf0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2be00 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
2be10 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
2be20 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
2be30 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
2be40 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
2be50 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
2be60 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
2be70 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2be80 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
2be90 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
2bea0 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c  le( szRight==0 |
2beb0 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c  | szRight+szCell
2bec0 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73  [d]+2<=szLeft-(s
2bed0 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20  zCell[r]+2) ){. 
2bee0 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
2bef0 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
2bf00 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
2bf10 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
2bf20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
2bf30 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
2bf40 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
2bf50 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
2bf60 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
2bf70 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
2bf80 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
2bf90 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
2bfa0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
2bfb0 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
2bfc0 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
2bfd0 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77  tnew[0])>0) or w
2bfe0 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61  e are the.  ** a
2bff0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2c000 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
2c010 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
2c020 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
2c030 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
2c040 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
2c050 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
2c060 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  that page..  */.
2c070 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
2c080 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
2c090 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
2c0a0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
2c0b0 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41   );..  /*.  ** A
2c0c0 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
2c0d0 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
2c0e0 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
2c0f0 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ible..  */.  ass
2c100 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
2c110 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67  >1 );.  pageFlag
2c120 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  s = pPage->aData
2c130 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
2c140 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
2c150 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
2c160 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
2c170 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
2c180 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
2c190 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
2c1a0 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b  i] = pgnoOld[i];
2c1b0 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  .      apOld[i] 
2c1c0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2c1d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c1e0 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
2c1f0 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
2c200 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2c210 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2c220 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nup;.    }else{.
2c230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e        assert( i>
2c240 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
2c250 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2c260 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
2c270 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e  gnoNew[i], pgnoN
2c280 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20  ew[i-1], 0);.   
2c290 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2c2a0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2c2b0 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
2c2c0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e   = pNew;.      n
2c2d0 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  New++;.    }.  }
2c2e0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
2c2f0 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77  old pages that w
2c300 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61  ere not reused a
2c310 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  s new pages..  *
2c320 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c  /.  while( i<nOl
2c330 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  d ){.    rc = fr
2c340 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  eePage(apOld[i])
2c350 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2c360 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2c370 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nup;.    release
2c380 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
2c390 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
2c3a0 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
2c3b0 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68    /*.  ** Put th
2c3c0 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61  e new pages in a
2c3d0 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  ccending order. 
2c3e0 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20   This helps to. 
2c3f0 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73   ** keep entries
2c400 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
2c410 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68  e in order so th
2c420 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f  at a scan.  ** o
2c430 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  f the table is a
2c440 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
2c450 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20  ough the file.  
2c460 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72  That.  ** in tur
2c470 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72  n helps the oper
2c480 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20  ating system to 
2c490 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20  deliver pages.  
2c4a0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ** from the disk
2c4b0 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20   more rapidly.. 
2c4c0 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e   **.  ** An O(n^
2c4d0 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72  2) insertion sor
2c4e0 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75  t algorithm is u
2c4f0 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20  sed, but since. 
2c500 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d   ** n is never m
2c510 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73  ore than NB (a s
2c520 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20  mall constant), 
2c530 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  that should.  **
2c540 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
2c550 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  m..  **.  ** Whe
2c560 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e  n NB==3, this on
2c570 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d  e optimization m
2c580 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73  akes the databas
2c590 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25  e.  ** about 25%
2c5a0 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67   faster for larg
2c5b0 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64  e insertions and
2c5c0 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f   deletions..  */
2c5d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d  .  for(i=0; i<k-
2c5e0 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  1; i++){.    int
2c5f0 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
2c600 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49  i];.    int minI
2c610 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = i;.    for(j=
2c620 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a  i+1; j<k; j++){.
2c630 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65        if( pgnoNe
2c640 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d  w[j]<(unsigned)m
2c650 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
2c660 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
2c670 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
2c680 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j];.      }.    
2c690 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
2c6a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
2c6b0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
2c6c0 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67  pT;.      t = pg
2c6d0 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  noNew[i];.      
2c6e0 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
2c6f0 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
2c700 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b  = pgnoNew[minI];
2c710 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
2c720 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  = apNew[minI];. 
2c730 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e       pgnoNew[min
2c740 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70  I] = t;.      ap
2c750 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a  New[minI] = pT;.
2c760 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43      }.  }.  TRAC
2c770 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
2c780 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a  : %d %d %d  new:
2c790 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
2c7a0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
2c7b0 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f  %d)\n",.    pgno
2c7c0 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c  Old[0], .    nOl
2c7d0 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31  d>=2 ? pgnoOld[1
2c7e0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  ] : 0,.    nOld>
2c7f0 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20  =3 ? pgnoOld[2] 
2c800 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77  : 0,.    pgnoNew
2c810 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  [0], szNew[0],. 
2c820 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e     nNew>=2 ? pgn
2c830 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[1] : 0, nNe
2c840 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
2c850 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
2c860 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20   ? pgnoNew[2] : 
2c870 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
2c880 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
2c890 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77  New>=4 ? pgnoNew
2c8a0 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  [3] : 0, nNew>=4
2c8b0 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
2c8c0 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70  .    nNew>=5 ? p
2c8d0 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e  gnoNew[4] : 0, n
2c8e0 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
2c8f0 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20  ] : 0));..  /*. 
2c900 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72   ** Evenly distr
2c910 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69  ibute the data i
2c920 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73  n apCell[] acros
2c930 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e  s the new pages.
2c940 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76  .  ** Insert div
2c950 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
2c960 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73  pParent as neces
2c970 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d  sary..  */.  j =
2c980 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
2c990 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
2c9a0 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65   /* Assemble the
2c9b0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
2c9c0 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  e. */.    MemPag
2c9d0 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
2c9e0 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
2c9f0 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
2ca00 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2ca10 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69  >pgno==pgnoNew[i
2ca20 5d 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ] );.    zeroPag
2ca30 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67  e(pNew, pageFlag
2ca40 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  s);.    assemble
2ca50 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
2ca60 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
2ca70 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
2ca80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2ca90 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
2caa0 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
2cab0 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
2cac0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
2cad0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
2cae0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2caf0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
2cb00 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
2cb10 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
2cb20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74  entries.    ** t
2cb30 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  hat point to the
2cb40 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
2cb50 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20  ere rearranged. 
2cb60 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65  These can be: le
2cb70 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72  ft.    ** childr
2cb80 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65  en of cells, the
2cb90 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
2cba0 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65  the page, or ove
2cbb0 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
2cbc0 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
2cbd0 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   cells..    */. 
2cbe0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2cbf0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  UUM ){.      for
2cc00 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69  (k=j; k<cntNew[i
2cc10 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; k++){.       
2cc20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43   assert( k<nMaxC
2cc30 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20  ells );.        
2cc40 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78  if( aFrom[k]==0x
2cc50 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72  FF || apCopy[aFr
2cc60 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e  om[k]]->pgno!=pN
2cc70 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ew->pgno ){.    
2cc80 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2cc90 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b  pPutOvfl(pNew, k
2cca0 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  -j);.          i
2ccb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ccc0 20 26 26 20 6c 65 61 66 43 6f 72 72 65 63 74 69   && leafCorrecti
2ccd0 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  on==0 ){.       
2cce0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2ccf0 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
2cd00 65 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54  e(apCell[k]), PT
2cd10 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
2cd20 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
2cd30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2cd40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cd50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cd60 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2cd70 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20  anup;.          
2cd80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2cd90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a    }.    }..    j
2cda0 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
2cdb0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
2cdc0 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
2cdd0 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
2cde0 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
2cdf0 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
2ce00 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
2ce10 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
2ce20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
2ce30 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e   */.    if( i<nN
2ce40 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20  ew-1 && j<nCell 
2ce50 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
2ce60 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
2ce70 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
2ce80 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
2ce90 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
2cea0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
2ceb0 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
2cec0 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
2ced0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2cee0 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
2cef0 61 53 70 61 63 65 32 5b 69 53 70 61 63 65 32 5d  aSpace2[iSpace2]
2cf00 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
2cf10 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  w->leaf ){.     
2cf20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
2cf30 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c  >aData[8], pCell
2cf40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 4);.        if
2cf50 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 0a  ( ISAUTOVACUUM .
2cf60 20 20 20 20 20 20 20 20 20 26 26 20 28 61 46 72           && (aFr
2cf70 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[j]==0xFF || a
2cf80 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d  pCopy[aFrom[j]]-
2cf90 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
2cfa0 6f 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  o).        ){.  
2cfb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2cfc0 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34  mapPut(pBt, get4
2cfd0 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 50 54 52  byte(pCell), PTR
2cfe0 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d  MAP_BTREE, pNew-
2cff0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
2d000 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d020 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2d030 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
2d040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d050 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
2d060 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
2d070 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65     /* If the tre
2d080 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61  e is a leaf-data
2d090 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73   tree, and the s
2d0a0 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76  iblings are leav
2d0b0 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  es, .        ** 
2d0c0 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
2d0d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
2d0e0 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65   apCell[]. Inste
2d0f0 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20  ad, the divider 
2d100 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
2d110 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
2d120 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   integer key for
2d130 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2d140 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20  cell of .       
2d150 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d   ** the sibling-
2d160 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
2d170 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  bove only..     
2d180 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65     */.        Ce
2d190 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
2d1a0 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
2d1b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
2d1c0 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c  rseCellPtr(pNew,
2d1d0 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66   apCell[j], &inf
2d1e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  o);.        pCel
2d1f0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20  l = pTemp;.     
2d200 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65     rc = fillInCe
2d210 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  ll(pParent, pCel
2d220 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
2d230 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a   0, 0, 0, &sz);.
2d240 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2d250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d260 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2d270 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2d280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2d290 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
2d2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2d2b0 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20  Cell -= 4;.     
2d2c0 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61     /* Obscure ca
2d2d0 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d  se for non-leaf-
2d2e0 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74  data trees: If t
2d2f0 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c  he cell at pCell
2d300 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   was.        ** 
2d310 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65  previously store
2d320 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65  d on a leaf node
2d330 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74  , and its report
2d340 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20  ed size was 4.  
2d350 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20        ** bytes, 
2d360 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75  then it may actu
2d370 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20  ally be smaller 
2d380 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20  than this .     
2d390 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74     ** (see sqlit
2d3a0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
2d3b0 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69  Ptr(), 4 bytes i
2d3c0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  s the minimum si
2d3d0 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ze of.        **
2d3e0 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20   any cell). But 
2d3f0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
2d400 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72  to pass the corr
2d410 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20  ect size to .   
2d420 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65       ** insertCe
2d430 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65  ll(), so reparse
2d440 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20   the cell now.. 
2d450 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2d460 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2d470 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61  his can never ha
2d480 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74  ppen in an SQLit
2d490 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20  e data file, as 
2d4a0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  all.        ** c
2d4b0 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73  ells are at leas
2d4c0 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e  t 4 bytes. It on
2d4d0 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d  ly happens in b-
2d4e0 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20  trees used.     
2d4f0 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74     ** to evaluat
2d500 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  e "IN (SELECT ..
2d510 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20  .)" and similar 
2d520 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20  clauses..       
2d530 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2d540 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a  szCell[j]==4 ){.
2d550 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2d560 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d  (leafCorrection=
2d570 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  =4);.          s
2d580 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
2d590 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b  pParent, pCell);
2d5a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d5b0 20 7d 0a 20 20 20 20 20 20 69 53 70 61 63 65 32   }.      iSpace2
2d5c0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73   += sz;.      as
2d5d0 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70  sert( sz<=pBt->p
2d5e0 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20  ageSize/4 );.   
2d5f0 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
2d600 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e2<=pBt->pageSiz
2d610 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  e );.      rc = 
2d620 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
2d630 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c  nt, nxDiv, pCell
2d640 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b  , sz, pTemp, 4);
2d650 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2d660 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2d670 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2d680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
2d690 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2d6a0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
2d6b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2d6c0 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
2d6d0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
2d6e0 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77  ent,nxDiv), pNew
2d6f0 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 20 20  ->pgno);..      
2d700 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2d710 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2d720 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61  abase, and not a
2d730 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
2d740 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75  .      ** then u
2d750 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2d760 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e  r map with an en
2d770 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
2d780 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
2d790 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c  ** that the cell
2d7a0 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70   just inserted p
2d7b0 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79  oints to (if any
2d7c0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
2d7d0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2d7e0 55 4d 20 26 26 20 21 6c 65 61 66 44 61 74 61 20  UM && !leafData 
2d7f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2d800 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50  ptrmapPutOvfl(pP
2d810 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20  arent, nxDiv);. 
2d820 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2d830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d840 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2d850 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2d860 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d870 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e      j++;.      n
2d880 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  xDiv++;.    }.. 
2d890 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f     /* Set the po
2d8a0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
2d8b0 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c  for the new sibl
2d8c0 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
2d8d0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2d8e0 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
2d8f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2d900 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  New->pgno, PTRMA
2d910 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
2d920 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
2d930 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d940 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
2d950 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2d960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d970 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
2d980 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  =nCell );.  asse
2d990 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20  rt( nOld>0 );.  
2d9a0 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
2d9b0 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61  ;.  if( (pageFla
2d9c0 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d  gs & PTF_LEAF)==
2d9d0 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68  0 ){.    u8 *zCh
2d9e0 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f  ild = &apCopy[nO
2d9f0 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b  ld-1]->aData[8];
2da00 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
2da10 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
2da20 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29  a[8], zChild, 4)
2da30 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  ;.    if( ISAUTO
2da40 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2da50 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
2da60 42 74 2c 20 67 65 74 34 62 79 74 65 28 7a 43 68  Bt, get4byte(zCh
2da70 69 6c 64 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  ild), PTRMAP_BTR
2da80 45 45 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  EE, apNew[nNew-1
2da90 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  ]->pgno);.      
2daa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2dab0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
2dac0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2dad0 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
2dae0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
2daf0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2db00 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
2db10 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
2db20 28 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  ( nxDiv==pParent
2db30 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d  ->nCell+pParent-
2db40 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
2db50 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20    /* Right-most 
2db60 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72  sibling is the r
2db70 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
2db80 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  of pParent */.  
2db90 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
2dba0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2dbb0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2dbc0 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31  , pgnoNew[nNew-1
2dbd0 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
2dbe0 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73   /* Right-most s
2dbf0 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65  ibling is the le
2dc00 66 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ft child of the 
2dc10 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70  first entry in p
2dc20 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61  Parent.    ** pa
2dc30 73 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  st the right-mos
2dc40 74 20 64 69 76 69 64 65 72 20 65 6e 74 72 79 20  t divider entry 
2dc50 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
2dc60 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2dc70 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29  (pParent, nxDiv)
2dc80 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31  , pgnoNew[nNew-1
2dc90 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ]);.  }..  /*.  
2dca0 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70  ** Balance the p
2dcb0 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74  arent page.  Not
2dcc0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65  e that the curre
2dcd0 6e 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20  nt page (pPage) 
2dce0 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20  might.  ** have 
2dcf0 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68  been added to th
2dd00 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74  e freelist so it
2dd10 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72   might no longer
2dd20 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
2dd30 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61  .  ** But the pa
2dd40 72 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61  rent page will a
2dd50 6c 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c  lways be initial
2dd60 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ized..  */.  ass
2dd70 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73  ert( pParent->is
2dd80 49 6e 69 74 20 29 3b 0a 20 20 73 71 6c 69 74 65  Init );.  sqlite
2dd90 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
2dda0 65 6c 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d  ell);.  apCell =
2ddb0 20 30 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41   0;.  TRACE(("BA
2ddc0 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20  LANCE: finished 
2ddd0 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20  with %d: old=%d 
2dde0 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c  new=%d cells=%d\
2ddf0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50  n",.          pP
2de00 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c  age->pgno, nOld,
2de10 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
2de20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
2de30 6f 77 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  ow = 0;.  releas
2de40 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2de50 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
2de60 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43   rc = balance(pC
2de70 75 72 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a  ur, 0);.  .  /*.
2de80 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66    ** Cleanup bef
2de90 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20  ore returning.. 
2dea0 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61   */.balance_clea
2deb0 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 50 61  nup:.  sqlite3Pa
2dec0 67 65 46 72 65 65 28 61 53 70 61 63 65 32 29 3b  geFree(aSpace2);
2ded0 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  .  sqlite3Scratc
2dee0 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  hFree(apCell);. 
2def0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
2df00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
2df10 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
2df20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
2df30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
2df40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2df50 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apNew[i]);.  }. 
2df60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2df70 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
2df80 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 72 65  rflow = 0;..  re
2df90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2dfa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2dfb0 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
2dfc0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
2dfd0 62 74 72 65 65 20 77 68 65 6e 20 74 68 65 20 72  btree when the r
2dfe0 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  oot.** page cont
2dff0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20  ains no cells.  
2e000 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72  This is an oppor
2e010 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74  tunity to make t
2e020 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c  he tree.** shall
2e030 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65  ower by one leve
2e040 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2e050 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2e060 65 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  er(BtCursor *pCu
2e070 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
2e080 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2e090 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
2e0a0 6f 66 20 42 2d 54 72 65 65 20 2a 2f 0a 20 20 4d  of B-Tree */.  M
2e0b0 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2e0d0 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61  he only child pa
2e0e0 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  ge of pPage */. 
2e0f0 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e110 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
2e120 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74   pChild */.  int
2e130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2e150 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
2e160 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
2e170 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e190 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72   /* The main BTr
2e1a0 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
2e1b0 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50    int mxCellPerP
2e1c0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
2e1d0 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
2e1e0 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61   of cells per pa
2e1f0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2e200 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2e210 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
2e220 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69  s from pages bei
2e230 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
2e240 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e260 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
2e270 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61  ll cells */..  a
2e280 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2e290 67 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ge==0 );.  pPage
2e2a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2e2b0 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  0];..  assert( p
2e2c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2e2d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2e2e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2e2f0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2e300 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  ) );.  pBt = pPa
2e310 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c  ge->pBt;.  mxCel
2e320 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45  lPerPage = MX_CE
2e330 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c  LL(pBt);.  apCel
2e340 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
2e350 63 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  c( mxCellPerPage
2e360 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69  *(sizeof(u8*)+si
2e370 7a 65 6f 66 28 75 31 36 29 29 20 29 3b 0a 20 20  zeof(u16)) );.  
2e380 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20  if( apCell==0 ) 
2e390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2e3a0 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  MEM;.  szCell = 
2e3b0 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d 78  (u16*)&apCell[mx
2e3c0 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20  CellPerPage];.  
2e3d0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2e3e0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ){.    /* The ta
2e3f0 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ble is completel
2e400 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54  y empty */.    T
2e410 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2e420 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e  empty table %d\n
2e430 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ", pPage->pgno))
2e440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2e450 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
2e460 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61 73  is empty but has
2e470 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61   one child.  Tra
2e480 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a  nsfer the.    **
2e490 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2e4a0 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64  m that one child
2e4b0 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70   into the root p
2e4c0 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a  age if it .    *
2e4d0 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69  * will fit.  Thi
2e4e0 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64 65  s reduces the de
2e4f0 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
2e500 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20  by one..    **. 
2e510 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f     ** If the roo
2e520 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  t page is page 1
2e530 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73 70  , it has less sp
2e540 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68  ace available th
2e550 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68  an.    ** its ch
2e560 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65 20  ild (due to the 
2e570 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72 20  100 byte header 
2e580 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
2e590 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
2e5a0 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
2e5b0 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20  ase fle), so it 
2e5c0 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c  might not be abl
2e5d0 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66  e to hold all of
2e5e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66   the .    ** inf
2e5f0 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74  ormation current
2e600 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ly contained in 
2e610 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74  the child.  If t
2e620 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20 20  his is the .    
2e630 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f  ** case, then do
2e640 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e   not do the tran
2e650 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67  sfer.  Leave pag
2e660 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70 74  e 1 empty except
2e670 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
2e680 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f  right-pointer to
2e690 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e   the child page.
2e6a0 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67 65    The child page
2e6b0 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20   becomes.    ** 
2e6c0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
2e6d0 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20   of the tree..  
2e6e0 20 20 2a 2f 0a 20 20 20 20 56 56 41 5f 4f 4e 4c    */.    VVA_ONL
2e6f0 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  Y( pCur->pagesSh
2e700 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20  uffled = 1 );.  
2e710 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2e720 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2e730 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2e740 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
2e750 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
2e760 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
2e770 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67  ( pgnoChild<=pag
2e780 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2e790 65 2d 3e 70 42 74 29 20 29 3b 0a 20 20 20 20 72  e->pBt) );.    r
2e7a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e7b0 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70  GetPage(pPage->p
2e7c0 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26  Bt, pgnoChild, &
2e7d0 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20  pChild, 0);.    
2e7e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2e7f0 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2e800 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
2e810 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ->pgno==1 ){.   
2e820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2e830 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68  treeInitPage(pCh
2e840 69 6c 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ild);.      if( 
2e850 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
2e860 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
2e870 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68       assert( pCh
2e880 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ild->nOverflow==
2e890 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2e8a0 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30  Child->nFree>=10
2e8b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2e8c0 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d  The child inform
2e8d0 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f  ation will fit o
2e8e0 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  n the root page,
2e8f0 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20   so do the.     
2e900 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20     ** copy */.  
2e910 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2e920 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50       zeroPage(pP
2e930 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
2e940 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[0]);.        
2e950 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c  for(i=0; i<pChil
2e960 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  d->nCell; i++){.
2e970 20 20 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c            apCell
2e980 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
2e990 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20  Child,i);.      
2e9a0 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20      szCell[i] = 
2e9b0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69  cellSizePtr(pChi
2e9c0 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a  ld, apCell[i]);.
2e9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e9e0 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
2e9f0 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43  Page, pChild->nC
2ea00 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43  ell, apCell, szC
2ea10 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ell);.        /*
2ea20 20 43 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d   Copy the right-
2ea30 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
2ea40 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65  hild to the pare
2ea50 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nt. */.        a
2ea60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2ea70 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2ea80 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2ea90 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
2eaa0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2eab0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2eac0 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  t+8], .         
2ead0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43 68     get4byte(&pCh
2eae0 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c  ild->aData[pChil
2eaf0 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  d->hdrOffset+8])
2eb00 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2eb10 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
2eb20 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2eb30 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
2eb40 20 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20   %d transfer to 
2eb50 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
2eb60 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
2eb70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2eb80 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73  /* The child has
2eb90 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
2eba0 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20  n that will fit 
2ebb0 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20  on the root..   
2ebc0 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65       ** The tree
2ebd0 20 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61   is already bala
2ebe0 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e  nced.  Do nothin
2ebf0 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52  g. */.        TR
2ec00 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
2ec10 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74  hild %d will not
2ec20 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e   fit on page 1\n
2ec30 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
2ec40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ec50 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63  else{.      memc
2ec60 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  py(pPage->aData,
2ec70 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20   pChild->aData, 
2ec80 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2ec90 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  leSize);.      p
2eca0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
2ecb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2ecc0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2ecd0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2ece0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2ecf0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66  TE_OK );.      f
2ed00 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  reePage(pChild);
2ed10 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42  .      TRACE(("B
2ed20 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72  ALANCE: transfer
2ed30 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72   child %d into r
2ed40 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  oot %d\n",.     
2ed50 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d           pChild-
2ed60 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67  >pgno, pPage->pg
2ed70 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
2ed80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ed90 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23  Overflow==0 );.#
2eda0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2edb0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2edc0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2edd0 55 4d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  UM && rc==SQLITE
2ede0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2edf0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
2ee00 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  s(pPage);.    }.
2ee10 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61  #endif.    relea
2ee20 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
2ee30 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f    }.end_shallow_
2ee40 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74  balance:.  sqlit
2ee50 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b  e3_free(apCell);
2ee60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ee70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74  ../*.** The root
2ee80 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
2ee90 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  l.**.** When thi
2eea0 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74  s happens, Creat
2eeb0 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  e a new child pa
2eec0 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a  ge and copy the.
2eed0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
2eee0 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65  he root into the
2eef0 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61   child.  Then ma
2ef00 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  ke the root.** p
2ef10 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67  age an empty pag
2ef20 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c  e with rightChil
2ef30 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  d pointing to th
2ef40 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20  e new.** child. 
2ef50 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20    Finally, call 
2ef60 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c  balance_internal
2ef70 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68  () on the new ch
2ef80 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20  ild.** to cause 
2ef90 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a  it to split..*/.
2efa0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2efb0 63 65 5f 64 65 65 70 65 72 28 42 74 43 75 72 73  ce_deeper(BtCurs
2efc0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
2efd0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2efe0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
2eff0 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
2f000 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
2f010 20 2a 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   *pPage;     /* 
2f020 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
2f030 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65  oot page */.  Me
2f040 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
2f050 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2f060 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2f070 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
2f080 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67  hild;     /* Pag
2f090 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2f0a0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
2f0b0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
2f0c0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  t;         /* Th
2f0d0 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e BTree */.  int
2f0e0 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
2f0f0 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65   /* Total usable
2f100 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
2f110 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2f120 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2f130 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ent of the paren
2f140 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  t page */.  u8 *
2f150 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  cdata;          
2f160 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2f170 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  e child page */.
2f180 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
2f190 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2f1a0 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 69  to page header i
2f1b0 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e  n parent */.  in
2f1c0 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
2f1d0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2f1e0 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20  ontent of first 
2f1f0 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a  cell in parent *
2f200 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  /..  assert( pCu
2f210 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20  r->iPage==0 );. 
2f220 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2f230 70 50 61 67 65 5b 30 5d 2d 3e 6e 4f 76 65 72 66  pPage[0]->nOverf
2f240 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 56 56 41 5f  low>0 );..  VVA_
2f250 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65  ONLY( pCur->page
2f260 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b  sShuffled = 1 );
2f270 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2f280 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 70 42  >apPage[0];.  pB
2f290 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2f2a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f2b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2f2c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2f2d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2f2e0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2f2f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2f300 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2f310 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2f320 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69  pChild, &pgnoChi
2f330 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ld, pPage->pgno,
2f340 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
2f350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73  return rc;.  ass
2f360 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2f370 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
2f380 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
2f390 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
2f3a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
2f3b0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2f3c0 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
2f3d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2f3e0 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62  ;.  cbrk = get2b
2f3f0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2f400 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68  );.  cdata = pCh
2f410 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65  ild->aData;.  me
2f420 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61 74  mcpy(cdata, &dat
2f430 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63  a[hdr], pPage->c
2f440 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67  ellOffset+2*pPag
2f450 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20  e->nCell-hdr);. 
2f460 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b 63   memcpy(&cdata[c
2f470 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b  brk], &data[cbrk
2f480 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 63 62  ], usableSize-cb
2f490 72 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rk);..  assert( 
2f4a0 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d  pChild->isInit==
2f4b0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
2f4c0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
2f4d0 28 70 43 68 69 6c 64 29 3b 0a 20 20 69 66 28 20  (pChild);.  if( 
2f4e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f4f0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  .    int nCopy =
2f500 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2f510 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  w*sizeof(pPage->
2f520 61 4f 76 66 6c 5b 30 5d 29 3b 0a 20 20 20 20 6d  aOvfl[0]);.    m
2f530 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
2f540 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66  vfl, pPage->aOvf
2f550 6c 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 70  l, nCopy);.    p
2f560 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2f570 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2f580 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 43 68  low;.    if( pCh
2f590 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ild->nOverflow )
2f5a0 7b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e  {.      pChild->
2f5b0 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 7d  nFree = 0;.    }
2f5c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68  .    assert( pCh
2f5d0 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67  ild->nCell==pPag
2f5e0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2f5f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2f600 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2f610 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2f620 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
2f630 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
2f640 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
2f650 45 41 46 29 3b 0a 20 20 20 20 70 75 74 34 62 79  EAF);.    put4by
2f660 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2f670 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2f680 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
2f690 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41  ;.    TRACE(("BA
2f6a0 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74  LANCE: copy root
2f6b0 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20   %d into %d\n", 
2f6c0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68  pPage->pgno, pCh
2f6d0 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
2f6e0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2f6f0 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
2f700 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2f710 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52  Child->pgno, PTR
2f720 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65  MAP_BTREE, pPage
2f730 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
2f740 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2f750 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
2f760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f770 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2f780 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2f790 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 7d  pChild);.      }
2f7a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2f7b0 0a 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d  .        pChild-
2f7c0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
2f7d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2f7e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
2f7f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f800 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
2f810 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ++;.    pCur->ap
2f820 50 61 67 65 5b 31 5d 20 3d 20 70 43 68 69 6c 64  Page[1] = pChild
2f830 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
2f840 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  x[0] = 0;.    rc
2f850 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
2f860 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  ot(pCur);.  }els
2f870 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
2f880 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a  ge(pChild);.  }.
2f890 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f8a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
2f8b0 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65 6e  that pCur curren
2f8c0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  tly points to ha
2f8d0 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69  s just been modi
2f8e0 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20  fied in.** some 
2f8f0 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69  way. This functi
2f900 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20 69  on figures out i
2f910 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74  f this modificat
2f920 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ion means the.**
2f930 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62   tree needs to b
2f940 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20  e balanced, and 
2f950 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20  if so calls the 
2f960 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
2f970 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e  ncing .** routin
2f980 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61 72 61 6d 65  e..** .** Parame
2f990 74 65 72 20 69 73 49 6e 73 65 72 74 20 69 73 20  ter isInsert is 
2f9a0 74 72 75 65 20 69 66 20 61 20 6e 65 77 20 63 65  true if a new ce
2f9b0 6c 6c 20 77 61 73 20 6a 75 73 74 20 69 6e 73 65  ll was just inse
2f9c0 72 74 65 64 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  rted into the.**
2f9d0 20 70 61 67 65 2c 20 6f 72 20 66 61 6c 73 65 20   page, or false 
2f9e0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
2f9f0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2fa00 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2fa10 20 69 6e 74 20 69 73 49 6e 73 65 72 74 29 7b 0a   int isInsert){.
2fa20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2fa30 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2fa40 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
2fa50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2fa60 65 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  e];..  assert( s
2fa70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2fa80 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2fa90 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43  tex) );.  if( pC
2faa0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2fab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fac0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2fad0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2fae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2faf0 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65  K && pPage->nOve
2fb00 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20  rflow>0 ){.     
2fb10 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65   rc = balance_de
2fb20 65 70 65 72 28 70 43 75 72 29 3b 0a 20 20 20 20  eper(pCur);.    
2fb30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2fb40 61 70 50 61 67 65 5b 30 5d 3d 3d 70 50 61 67 65  apPage[0]==pPage
2fb50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2fb60 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2fb70 6f 77 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c  ow==0 || rc!=SQL
2fb80 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a  ITE_OK );.    }.
2fb90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fba0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e  TE_OK && pPage->
2fbb0 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
2fbc0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73    rc = balance_s
2fbd0 68 61 6c 6c 6f 77 65 72 28 70 43 75 72 29 3b 0a  hallower(pCur);.
2fbe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2fbf0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 70  ur->apPage[0]==p
2fc00 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Page );.      as
2fc10 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2fc20 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63 21  erflow==0 || rc!
2fc30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2fc40 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2fc50 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
2fc60 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20  rflow>0 || .    
2fc70 20 20 20 20 28 21 69 73 49 6e 73 65 72 74 20 26      (!isInsert &
2fc80 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70  & pPage->nFree>p
2fc90 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2fca0 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20  eSize*2/3) ){.  
2fcb0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2fcc0 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a  _nonroot(pCur);.
2fcd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2fce0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2fcf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
2fd00 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  cks all cursors 
2fd10 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61  that point to ta
2fd20 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  ble pgnoRoot..**
2fd30 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65   If any of those
2fd40 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f 70   cursors were op
2fd50 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
2fd60 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72 65  ==0 in a differe
2fd70 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  nt.** database c
2fd80 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61 74  onnection (a dat
2fd90 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2fda0 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68 65   that shares the
2fdb0 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65 20   pager.** cache 
2fdc0 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
2fdd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64   connection) and
2fde0 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e   that other conn
2fdf0 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f  ection .** is no
2fe00 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e 63  t in the ReadUnc
2fe10 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65 2c  ommmitted state,
2fe20 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2fe30 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  ne returns .** S
2fe40 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a  QLITE_LOCKED..**
2fe50 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20 63  .** As well as c
2fe60 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c  ursors with wrFl
2fe70 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20 77  ag==0, cursors w
2fe80 69 74 68 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c  ith .** isIncrbl
2fe90 6f 62 48 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20  obHandle==1 are 
2fea0 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65 64 20  also considered 
2feb0 27 72 65 61 64 27 20 63 75 72 73 6f 72 73 20 62  'read' cursors b
2fec0 65 63 61 75 73 65 0a 2a 2a 20 69 6e 63 72 65 6d  ecause.** increm
2fed0 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2fee0 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  rs are used for 
2fef0 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64  both reading and
2ff00 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
2ff10 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73  When pgnoRoot is
2ff20 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2ff30 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  f an intkey tabl
2ff40 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
2ff50 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70   is also.** resp
2ff60 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61  onsible for inva
2ff70 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65  lidating increme
2ff80 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2ff90 73 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65  s when the table
2ffa0 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68   row.** on which
2ffb0 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64   they are opened
2ffc0 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d   is deleted or m
2ffd0 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73  odified. Cursors
2ffe0 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
2fff0 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  .** according to
30000 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
30010 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ules:.**.**   1)
30020 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72   When BtreeClear
30030 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65  Table() is calle
30040 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d to completely 
30050 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65  delete the conte
30060 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61  nts.**      of a
30070 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70   B-Tree table, p
30080 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74  Exclude is set t
30090 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d  o zero and param
300a0 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a  eter iRow is .**
300b0 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e        set to non
300c0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63  -zero. In this c
300d0 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e  ase all incremen
300e0 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  tal blob cursors
300f0 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e   open.**      on
30100 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
30110 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72  d at pgnoRoot ar
30120 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
30130 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42  *.**   2) When B
30140 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74  treeInsert(), Bt
30150 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
30160 74 72 65 65 50 75 74 44 61 74 61 28 29 20 69 73  treePutData() is
30170 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20   called to .**  
30180 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62      modify a tab
30190 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51  le row via an SQ
301a0 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78  L statement, pEx
301b0 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20  clude is set to 
301c0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69  the .**      wri
301d0 74 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74  te cursor used t
301e0 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63  o do the modific
301f0 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65  ation and parame
30200 74 65 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a  ter iRow is set.
30210 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 69  **      to the i
30220 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66  nteger row id of
30230 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72   the B-Tree entr
30240 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  y being modified
30250 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20  . Unless.**     
30260 20 70 45 78 63 6c 75 64 65 20 69 73 20 69 74 73   pExclude is its
30270 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  elf an increment
30280 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20  al blob cursor, 
30290 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65  then all increme
302a0 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f  ntal.**      blo
302b0 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
302c0 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68  n row iRow of th
302d0 65 20 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76  e B-Tree are inv
302e0 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  alidated..**.** 
302f0 20 20 33 29 20 49 66 20 62 6f 74 68 20 70 45 78    3) If both pEx
30300 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61  clude and iRow a
30310 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20  re set to zero, 
30320 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  no incremental b
30330 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  lob .**      cur
30340 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
30350 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
30360 69 6e 74 20 63 68 65 63 6b 46 6f 72 52 65 61 64  int checkForRead
30370 43 6f 6e 66 6c 69 63 74 73 28 0a 20 20 42 74 72  Conflicts(.  Btr
30380 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20  ee *pBtree,     
30390 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
303a0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65  base file to che
303b0 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ck */.  Pgno pgn
303c0 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  oRoot,          
303d0 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61 64  /* Look for read
303e0 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 69 73   cursors on this
303f0 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 43 75   btree */.  BtCu
30400 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 20  rsor *pExclude, 
30410 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68      /* Ignore th
30420 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69  is cursor */.  i
30430 36 34 20 69 52 6f 77 20 20 20 20 20 20 20 20 20  64 iRow         
30440 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
30450 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
30460 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 29 7b  e changing */.){
30470 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
30480 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
30490 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  = pBtree->pBt;. 
304a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
304b0 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Btree->db;.  ass
304c0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
304d0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72  eHoldsMutex(pBtr
304e0 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ee) );.  for(p=p
304f0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
30500 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
30510 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65   if( p==pExclude
30520 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
30530 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
30540 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e  !=pgnoRoot ) con
30550 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
30560 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
30570 4c 4f 42 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  LOB.    if( p->i
30580 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
30590 26 26 20 28 20 0a 20 20 20 20 20 20 20 20 20 28  && ( .         (
305a0 21 70 45 78 63 6c 75 64 65 20 26 26 20 69 52 6f  !pExclude && iRo
305b0 77 29 0a 20 20 20 20 20 20 7c 7c 20 28 70 45 78  w).      || (pEx
305c0 63 6c 75 64 65 20 26 26 20 21 70 45 78 63 6c 75  clude && !pExclu
305d0 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  de->isIncrblobHa
305e0 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e  ndle && p->info.
305f0 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
30600 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74  )){.      p->eSt
30610 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
30620 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ALID;.    }.#end
30630 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53  if.    if( p->eS
30640 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
30650 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ID ) continue;. 
30660 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67     if( p->wrFlag
30670 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ==0 .#ifndef SQL
30680 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
30690 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49  B.     || p->isI
306a0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65  ncrblobHandle.#e
306b0 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
306c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68    sqlite3 *dbOth
306d0 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e  er = p->pBtree->
306e0 64 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  db;.      assert
306f0 28 64 62 4f 74 68 65 72 29 3b 0a 20 20 20 20 20  (dbOther);.     
30700 20 69 66 28 20 64 62 4f 74 68 65 72 21 3d 64 62   if( dbOther!=db
30710 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c   && (dbOther->fl
30720 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
30730 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30  dUncommitted)==0
30740 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30750 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
30760 63 6b 65 64 28 64 62 2c 20 64 62 4f 74 68 65 72  cked(db, dbOther
30770 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
30780 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  n SQLITE_LOCKED_
30790 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
307a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
307b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
307c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
307d0 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
307e0 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
307f0 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
30800 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
30810 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
30820 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
30830 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
30840 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
30850 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
30860 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
30870 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
30880 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
30890 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
308a0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
308b0 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
308c0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
308d0 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
308e0 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
308f0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
30900 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
30910 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
30920 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
30930 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
30940 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
30950 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  th ignored..*/.i
30960 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
30970 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f  nsert(.  BtCurso
30980 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
30990 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
309a0 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
309b0 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75  table of this cu
309c0 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsor */.  const 
309d0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
309e0 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
309f0 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72  key of the new r
30a00 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
30a10 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
30a20 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65  t nData,  /* The
30a30 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77   data of the new
30a40 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
30a50 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
30a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30a70 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30  umber of extra 0
30a80 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
30a90 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   to data */.  in
30aa0 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20 20  t appendBias    
30ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30ac0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
30ad0 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64  likely an append
30ae0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
30af0 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e  .  int loc;.  in
30b00 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t szNew;.  int i
30b10 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
30b20 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
30b30 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
30b40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
30b50 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
30b60 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
30b70 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
30b80 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
30b90 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
30ba0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
30bb0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
30bc0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
30bd0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
30be0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  E );.  assert( !
30bf0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
30c00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
30c10 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 72 63 20  >wrFlag );.  rc 
30c20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f  = checkForReadCo
30c30 6e 66 6c 69 63 74 73 28 70 43 75 72 2d 3e 70 42  nflicts(pCur->pB
30c40 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
30c50 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79  Root, pCur, nKey
30c60 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20 20  );.  if( rc ){  
30c70 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
30c80 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
30c90 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
30ca0 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
30cb0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
30cc0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
30cd0 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20  REDCACHE );.    
30ce0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
30cf0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
30d00 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
30d10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
30d20 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20  ur->skip;.  }.. 
30d30 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
30d40 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
30d50 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
30d60 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a   on this table *
30d70 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
30d80 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
30d90 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51  );.  if( .    SQ
30da0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
30db0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
30dc0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
30dd0 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20  t, pCur)) ||.   
30de0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
30df0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
30e00 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c  veto(pCur, pKey,
30e10 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61   nKey, appendBia
30e20 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20  s, &loc)).  ){. 
30e30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30e40 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
30e50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
30e60 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
30e70 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
30e80 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  || nKey>=0 );.  
30e90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
30ea0 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69  eaf || !pPage->i
30eb0 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52 41 43 45  ntKey );.  TRACE
30ec0 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65  (("INSERT: table
30ed0 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64  =%d nkey=%lld nd
30ee0 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25  ata=%d page=%d %
30ef0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
30f00 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
30f10 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61  nKey, nData, pPa
30f20 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  ge->pgno,.      
30f30 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76      loc==0 ? "ov
30f40 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20  erwrite" : "new 
30f50 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65  entry"));.  asse
30f60 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
30f70 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54  t );.  allocateT
30f80 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
30f90 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e   newCell = pBt->
30fa0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28  pTmpSpace;.  if(
30fb0 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65   newCell==0 ) re
30fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
30fd0 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  M;.  rc = fillIn
30fe0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43  Cell(pPage, newC
30ff0 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  ell, pKey, nKey,
31000 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e   pData, nData, n
31010 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20  Zero, &szNew);. 
31020 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
31030 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73  nd_insert;.  ass
31040 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c  ert( szNew==cell
31050 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e  SizePtr(pPage, n
31060 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73  ewCell) );.  ass
31070 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43  ert( szNew<=MX_C
31080 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
31090 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  .  idx = pCur->a
310a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
310b0 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20  ];.  if( loc==0 
310c0 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  && CURSOR_VALID=
310d0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
310e0 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a  .    u16 szOld;.
310f0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c      assert( idx<
31100 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
31110 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31120 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
31130 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31140 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
31150 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
31160 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65  .    }.    oldCe
31170 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
31180 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 69  age, idx);.    i
31190 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
311a0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
311b0 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c  newCell, oldCell
311c0 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 4);.    }.    
311d0 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65  szOld = cellSize
311e0 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  Ptr(pPage, oldCe
311f0 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  ll);.    rc = cl
31200 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f  earCell(pPage, o
31210 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28  ldCell);.    if(
31220 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
31230 6e 73 65 72 74 3b 0a 20 20 20 20 72 63 20 3d 20  nsert;.    rc = 
31240 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
31250 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 20  idx, szOld);.   
31260 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31270 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 67 6f 74  OK ) {.      got
31280 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
31290 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
312a0 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e  loc<0 && pPage->
312b0 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61  nCell>0 ){.    a
312c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
312d0 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  af );.    idx = 
312e0 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
312f0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
31300 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
31310 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
31320 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
31330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
31340 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
31350 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e  );.  }.  rc = in
31360 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20  sertCell(pPage, 
31370 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a  idx, newCell, sz
31380 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
31390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
313a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  ){.    rc = bala
313b0 6e 63 65 28 70 43 75 72 2c 20 31 29 3b 0a 20 20  nce(pCur, 1);.  
313c0 7d 0a 0a 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b  }..  /* Must mak
313d0 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77  e sure nOverflow
313e0 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72   is reset to zer
313f0 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62 61  o even if the ba
31400 6c 61 6e 63 65 28 29 0a 20 20 2a 2a 20 66 61 69  lance().  ** fai
31410 6c 73 2e 20 20 49 6e 74 65 72 6e 61 6c 20 64 61  ls.  Internal da
31420 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ta structure cor
31430 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  ruption will res
31440 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a  ult otherwise. *
31450 2f 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  /.  pCur->apPage
31460 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
31470 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
31480 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31490 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f  OK ){.    moveTo
314a0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Root(pCur);.  }.
314b0 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65  end_insert:.  re
314c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
314d0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74  * Delete the ent
314e0 72 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ry that the curs
314f0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
31500 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
31510 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
31520 6e 67 20 61 74 20 61 20 61 72 62 69 74 72 61 72  ng at a arbitrar
31530 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69  y location..*/.i
31540 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
31550 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a  elete(BtCursor *
31560 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
31570 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
31580 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
31590 67 65 5d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  ge];.  int idx;.
315a0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
315b0 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63  *pCell;.  int rc
315c0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  ;.  Pgno pgnoChi
315d0 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20  ld = 0;.  Btree 
315e0 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
315f0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
31600 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
31610 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
31620 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
31630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31640 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
31650 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
31660 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
31670 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
31680 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
31690 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ly );.  if( pCur
316a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
316b0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
316c0 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
316d0 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52  .  }.  if( NEVER
316e0 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  (pCur->aiIdx[pCu
316f0 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
31700 2d 3e 6e 43 65 6c 6c 29 20 29 7b 0a 20 20 20 20  ->nCell) ){.    
31710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
31720 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72  ROR;  /* The cur
31730 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
31740 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ing to anything 
31750 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  */.  }.  assert(
31760 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b   pCur->wrFlag );
31770 0a 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72  .  rc = checkFor
31780 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
31790 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
317a0 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66   pCur, pCur->inf
317b0 6f 2e 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 72  o.nKey);.  if( r
317c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
317d0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
317e0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
317f0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
31800 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  */.    assert( r
31810 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  c==SQLITE_LOCKED
31820 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a  _SHAREDCACHE );.
31830 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
31840 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65   }..  /* Restore
31850 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
31860 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20  sor position (a 
31870 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72  no-op if the cur
31880 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20  sor is not in . 
31890 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49   ** CURSOR_REQUI
318a0 52 45 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e  RESEEK state) an
318b0 64 20 73 61 76 65 20 74 68 65 20 70 6f 73 69 74  d save the posit
318c0 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
318d0 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20  r cursors .  ** 
318e0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
318f0 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c   table. Then cal
31900 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
31910 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67  ite() on the pag
31920 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
31930 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65  entry will be de
31940 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f  leted from..  */
31950 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72 63 20  .  if( .    (rc 
31960 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
31970 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 29 21 3d  osition(pCur))!=
31980 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
31990 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
319a0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
319b0 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  t, pCur))!=0 ||.
319c0 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65      (rc = sqlite
319d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
319e0 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 0a  e->pDbPage))!=0.
319f0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
31a00 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  rc;.  }..  /* Lo
31a10 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69  cate the cell wi
31a20 74 68 69 6e 20 69 74 73 20 70 61 67 65 20 61 6e  thin its page an
31a30 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70 6f  d leave pCell po
31a40 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20 20  inting to the.  
31a50 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c 65  ** data. The cle
31a60 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72  arCell() call fr
31a70 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ees any overflow
31a80 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
31a90 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
31aa0 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69  cell. The cell i
31ab0 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20 69  tself is still i
31ac0 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 64  ntact..  */.  id
31ad0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
31ae0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
31af0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
31b00 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
31b10 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
31b20 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   ){.    pgnoChil
31b30 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
31b40 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ll);.  }.  rc = 
31b50 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
31b60 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72   pCell);.  if( r
31b70 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
31b80 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  rc;.  }..  if( !
31b90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
31ba0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
31bb0 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62   entry we are ab
31bc0 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73  out to delete is
31bd0 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69   not a leaf so i
31be0 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20  f we do not.    
31bf0 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ** do something 
31c00 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20  we will leave a 
31c10 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72  hole on an inter
31c20 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
31c30 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c   We have to fill
31c40 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76   the hole by mov
31c50 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72  ing in a cell fr
31c60 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a  om a leaf.  The.
31c70 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c      ** next Cell
31c80 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74   after the one t
31c90 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20  o be deleted is 
31ca0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
31cb0 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  ist and.    ** t
31cc0 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77  o be a leaf so w
31cd0 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20  e can use it..  
31ce0 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f    */.    BtCurso
31cf0 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 4d  r leafCur;.    M
31d00 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 50 61 67  emPage *pLeafPag
31d10 65 20 3d 20 30 3b 0a 0a 20 20 20 20 75 6e 73 69  e = 0;..    unsi
31d20 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74  gned char *pNext
31d30 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65  ;.    int notUse
31d40 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  d;.    unsigned 
31d50 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d  char *tempCell =
31d60 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
31d70 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
31d80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
31d90 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
31da0 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b  pCur, &leafCur);
31db0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31dc0 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66  3BtreeNext(&leaf
31dd0 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  Cur, &notUsed);.
31de0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31df0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
31e00 73 73 65 72 74 28 20 6c 65 61 66 43 75 72 2e 61  ssert( leafCur.a
31e10 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69 50 61  iIdx[leafCur.iPa
31e20 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ge]==0 );.      
31e30 70 4c 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66  pLeafPage = leaf
31e40 43 75 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43  Cur.apPage[leafC
31e50 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20  ur.iPage];.     
31e60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31e70 65 72 57 72 69 74 65 28 70 4c 65 61 66 50 61 67  erWrite(pLeafPag
31e80 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
31e90 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
31ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31eb0 20 20 69 6e 74 20 6c 65 61 66 43 75 72 73 6f 72    int leafCursor
31ec0 49 6e 76 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  Invalid = 0;.   
31ed0 20 20 20 75 31 36 20 73 7a 4e 65 78 74 3b 0a 20     u16 szNext;. 
31ee0 20 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c       TRACE(("DEL
31ef0 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65  ETE: table=%d de
31f00 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20 66 72  lete internal fr
31f10 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20 66 72  om %d replace fr
31f20 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20  om leaf %d\n",. 
31f30 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67          pCur->pg
31f40 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70  noRoot, pPage->p
31f50 67 6e 6f 2c 20 70 4c 65 61 66 50 61 67 65 2d 3e  gno, pLeafPage->
31f60 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72  pgno));.      dr
31f70 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  opCell(pPage, id
31f80 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
31f90 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
31fa0 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e       pNext = fin
31fb0 64 43 65 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c  dCell(pLeafPage,
31fc0 20 30 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78   0);.      szNex
31fd0 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  t = cellSizePtr(
31fe0 70 4c 65 61 66 50 61 67 65 2c 20 70 4e 65 78 74  pLeafPage, pNext
31ff0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32000 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
32010 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a  t)>=szNext+4 );.
32020 20 20 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65        allocateTe
32030 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
32040 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70      tempCell = p
32050 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
32060 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c       if( tempCel
32070 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
32080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
32090 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
320a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
320b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
320c0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
320d0 61 67 65 2c 20 69 64 78 2c 20 70 4e 65 78 74 2d  age, idx, pNext-
320e0 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d  4, szNext+4, tem
320f0 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  pCell, 0);.     
32100 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   }...      /* Th
32110 65 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74  e "if" statement
32120 20 69 6e 20 74 68 65 20 6e 65 78 74 20 63 6f 64   in the next cod
32130 65 20 62 6c 6f 63 6b 20 69 73 20 63 72 69 74 69  e block is criti
32140 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20  cal.  The.      
32150 2a 2a 20 73 6c 69 67 68 74 65 73 74 20 65 72 72  ** slightest err
32160 6f 72 20 69 6e 20 74 68 61 74 20 73 74 61 74 65  or in that state
32170 6d 65 6e 74 20 77 6f 75 6c 64 20 61 6c 6c 6f 77  ment would allow
32180 20 53 51 4c 69 74 65 20 74 6f 20 6f 70 65 72 61   SQLite to opera
32190 74 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  te.      ** corr
321a0 65 63 74 6c 79 20 6d 6f 73 74 20 6f 66 20 74 68  ectly most of th
321b0 65 20 74 69 6d 65 20 62 75 74 20 70 72 6f 64 75  e time but produ
321c0 63 65 20 76 65 72 79 20 72 61 72 65 20 66 61 69  ce very rare fai
321d0 6c 75 72 65 73 2e 20 20 54 6f 0a 20 20 20 20 20  lures.  To.     
321e0 20 2a 2a 20 67 75 61 72 64 20 61 67 61 69 6e 73   ** guard agains
321f0 74 20 74 68 69 73 2c 20 74 68 65 20 66 6f 6c 6c  t this, the foll
32200 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 68 65 6c  owing macros hel
32210 70 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  p to verify that
32220 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 22 69  .      ** the "i
32230 66 22 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  f" statement is 
32240 77 65 6c 6c 20 74 65 73 74 65 64 2e 0a 20 20 20  well tested..   
32250 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74     */.      test
32260 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76  case( pPage->nOv
32270 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61  erflow==0 && pPa
32280 67 65 2d 3e 6e 46 72 65 65 3c 70 42 74 2d 3e 75  ge->nFree<pBt->u
32290 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a 20  sableSize*2/3 . 
322a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322b0 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46  && pLeafPage->nF
322c0 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70  ree+2+szNext > p
322d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
322e0 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  /3 );.      test
322f0 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76  case( pPage->nOv
32300 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61  erflow==0 && pPa
32310 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e  ge->nFree==pBt->
32320 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a  usableSize*2/3 .
32330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32340 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e   && pLeafPage->n
32350 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20  Free+2+szNext > 
32360 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
32370 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73  2/3 );.      tes
32380 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f  tcase( pPage->nO
32390 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50  verflow==0 && pP
323a0 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d  age->nFree==pBt-
323b0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b  >usableSize*2/3+
323c0 31 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1 .             
323d0 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65      && pLeafPage
323e0 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
323f0 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
32400 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20  ze*2/3 );.      
32410 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
32420 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 26 26 20  >nOverflow>0 && 
32430 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 70 42  pPage->nFree<=pB
32440 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
32450 33 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3.              
32460 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d     && pLeafPage-
32470 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20  >nFree+2+szNext 
32480 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
32490 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74  e*2/3 );.      t
324a0 65 73 74 63 61 73 65 28 20 28 70 50 61 67 65 2d  estcase( (pPage-
324b0 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  >nOverflow>0 || 
324c0 28 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 20  (pPage->nFree > 
324d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
324e0 32 2f 33 29 29 0a 20 20 20 20 20 20 20 20 20 20  2/3)).          
324f0 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
32500 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
32510 65 78 74 20 3d 3d 20 70 42 74 2d 3e 75 73 61 62  ext == pBt->usab
32520 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 0a 0a  leSize*2/3 );...
32530 20 20 20 20 20 20 69 66 28 20 28 70 50 61 67 65        if( (pPage
32540 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
32550 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e   (pPage->nFree >
32560 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
32570 2a 32 2f 33 29 29 20 26 26 0a 20 20 20 20 20 20  *2/3)) &&.      
32580 20 20 20 20 28 70 4c 65 61 66 50 61 67 65 2d 3e      (pLeafPage->
32590 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e  nFree+2+szNext >
325a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
325b0 2a 32 2f 33 29 0a 20 20 20 20 20 20 29 7b 0a 20  *2/3).      ){. 
325c0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
325d0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
325e0 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  f the internal n
325f0 6f 64 65 20 69 73 20 6e 6f 77 20 65 69 74 68 65  ode is now eithe
32600 72 20 6f 76 65 72 66 6c 6f 77 69 6e 67 0a 20 20  r overflowing.  
32610 20 20 20 20 20 20 2a 2a 20 6f 72 20 75 6e 64 65        ** or unde
32620 72 66 75 6c 6c 20 61 6e 64 20 74 68 65 20 6c 65  rfull and the le
32630 61 66 20 6e 6f 64 65 20 77 69 6c 6c 20 62 65 20  af node will be 
32640 75 6e 64 65 72 66 75 6c 6c 20 61 66 74 65 72 20  underfull after 
32650 74 68 65 20 6a 75 73 74 20 63 65 6c 6c 20 0a 20  the just cell . 
32660 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
32670 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
32680 20 6e 6f 64 65 20 69 73 20 64 65 6c 65 74 65 64   node is deleted
32690 20 66 72 6f 6d 20 69 74 2e 20 54 68 69 73 20 69   from it. This i
326a0 73 20 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20  s a special.    
326b0 20 20 20 20 2a 2a 20 63 61 73 65 20 62 65 63 61      ** case beca
326c0 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
326d0 62 61 6c 61 6e 63 65 28 29 20 74 6f 20 63 6f 72  balance() to cor
326e0 72 65 63 74 20 74 68 65 20 69 6e 74 65 72 6e 61  rect the interna
326f0 6c 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 2a  l node.        *
32700 2a 20 6d 61 79 20 63 68 61 6e 67 65 20 74 68 65  * may change the
32710 20 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20   tree structure 
32720 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 74  and invalidate t
32730 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 20  he contents of. 
32740 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65         ** the le
32750 61 66 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61  afCur.apPage[] a
32760 6e 64 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78  nd leafCur.aiIdx
32770 5b 5d 20 61 72 72 61 79 73 2c 20 77 68 69 63 68  [] arrays, which
32780 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
32790 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
327a0 62 61 6c 61 6e 63 65 28 29 20 72 65 71 75 69 72  balance() requir
327b0 65 64 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68  ed to correct th
327c0 65 20 75 6e 64 65 72 66 75 6c 6c 20 6c 65 61 66  e underfull leaf
327d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65  .        ** node
327e0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
327f0 20 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 72 6d       ** The form
32800 75 6c 61 20 75 73 65 64 20 69 6e 20 74 68 65 20  ula used in the 
32810 65 78 70 72 65 73 73 69 6f 6e 20 61 62 6f 76 65  expression above
32820 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 66 61   are based on fa
32830 63 65 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20  cets of.        
32840 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  ** the SQLite fi
32850 6c 65 2d 66 6f 72 6d 61 74 20 74 68 61 74 20 64  le-format that d
32860 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 6f 76 65  o not change ove
32870 72 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  r time..        
32880 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  */.        testc
32890 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ase( pPage->nFre
328a0 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e==pBt->usableSi
328b0 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20  ze*2/3+1 );.    
328c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
328d0 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
328e0 2b 73 7a 4e 65 78 74 3d 3d 70 42 74 2d 3e 75 73  +szNext==pBt->us
328f0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29  ableSize*2/3+1 )
32900 3b 0a 20 20 20 20 20 20 20 20 6c 65 61 66 43 75  ;.        leafCu
32910 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 31 3b  rsorInvalid = 1;
32920 0a 20 20 20 20 20 20 7d 20 20 20 20 20 20 20 20  .      }        
32930 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
32940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32950 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
32960 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
32970 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
32980 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
32990 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
329a0 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
329b0 20 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64   idx), pgnoChild
329c0 29 3b 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f  );.        VVA_O
329d0 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73  NLY( pCur->pages
329e0 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a  Shuffled = 0 );.
329f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
32a00 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20  ance(pCur, 0);. 
32a10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
32a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32a30 26 26 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76  && leafCursorInv
32a40 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  alid ){.        
32a50 2f 2a 20 54 68 65 20 6c 65 61 66 2d 6e 6f 64 65  /* The leaf-node
32a60 20 69 73 20 6e 6f 77 20 75 6e 64 65 72 66 75 6c   is now underful
32a70 6c 20 61 6e 64 20 73 6f 20 74 68 65 20 74 72 65  l and so the tre
32a80 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
32a90 20 20 20 20 20 20 20 2a 2a 20 72 65 62 61 6c 61         ** rebala
32aa0 6e 63 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74  nced. However, t
32ab0 68 65 20 62 61 6c 61 6e 63 65 28 29 20 6f 70 65  he balance() ope
32ac0 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 69 6e  ration on the in
32ad0 74 65 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ternal.        *
32ae0 2a 20 6e 6f 64 65 20 61 62 6f 76 65 20 6d 61 79  * node above may
32af0 20 68 61 76 65 20 6d 6f 64 69 66 69 65 64 20 74   have modified t
32b00 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  he structure of 
32b10 74 68 65 20 42 2d 54 72 65 65 20 61 6e 64 0a 20  the B-Tree and. 
32b20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 65         ** so the
32b30 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
32b40 73 20 6f 66 20 6c 65 61 66 43 75 72 2e 61 70 50  s of leafCur.apP
32b50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75  age[] and leafCu
32b60 72 2e 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20  r.aiIdx[].      
32b70 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
32b80 74 72 75 73 74 65 64 2e 0a 20 20 20 20 20 20 20  trusted..       
32b90 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
32ba0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
32bb0 65 20 74 6f 20 63 6f 70 79 20 74 68 65 20 61 6e  e to copy the an
32bc0 63 65 73 74 72 79 20 66 72 6f 6d 20 70 43 75 72  cestry from pCur
32bd0 2c 20 61 73 20 74 68 65 20 73 61 6d 65 0a 20 20  , as the same.  
32be0 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
32bf0 28 29 20 63 61 6c 6c 20 68 61 73 20 69 6e 76 61  () call has inva
32c00 6c 69 64 61 74 65 64 20 74 68 65 20 70 43 75 72  lidated the pCur
32c10 2d 3e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  ->apPage[] and a
32c20 69 49 64 78 5b 5d 0a 20 20 20 20 20 20 20 20 2a  iIdx[].        *
32c30 2a 20 61 72 72 61 79 73 2e 20 0a 20 20 20 20 20  * arrays. .     
32c40 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
32c50 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 61 76   The call to sav
32c60 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
32c70 29 20 62 65 6c 6f 77 20 69 6e 74 65 72 6e 61 6c  ) below internal
32c80 6c 79 20 73 61 76 65 73 20 74 68 65 20 0a 20 20  ly saves the .  
32c90 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 74 68 61        ** key tha
32ca0 74 20 6c 65 61 66 43 75 72 20 69 73 20 63 75 72  t leafCur is cur
32cb0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
32cc0 74 6f 2e 20 43 75 72 72 65 6e 74 6c 79 2c 20 74  to. Currently, t
32cd0 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
32ce0 61 72 65 20 74 77 6f 20 63 6f 70 69 65 73 20 6f  are two copies o
32cf0 66 20 74 68 61 74 20 6b 65 79 20 69 6e 20 74 68  f that key in th
32d00 65 20 74 72 65 65 20 2d 20 6f 6e 65 20 68 65 72  e tree - one her
32d10 65 20 6f 6e 20 74 68 65 20 6c 65 61 66 0a 20 20  e on the leaf.  
32d20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 61 6e        ** page an
32d30 64 20 6f 6e 65 20 6f 6e 20 73 6f 6d 65 20 69 6e  d one on some in
32d40 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 74  ternal node in t
32d50 68 65 20 74 72 65 65 2e 20 54 68 65 20 63 6f 70  he tree. The cop
32d60 79 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  y on.        ** 
32d70 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 69 73  the leaf node is
32d80 20 61 6c 77 61 79 73 20 74 68 65 20 6e 65 78 74   always the next
32d90 20 6b 65 79 20 69 6e 20 74 72 65 65 2d 6f 72 64   key in tree-ord
32da0 65 72 20 61 66 74 65 72 20 74 68 65 20 0a 20 20  er after the .  
32db0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 6e        ** copy on
32dc0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
32dd0 64 65 2e 20 53 6f 2c 20 74 68 65 20 63 61 6c 6c  de. So, the call
32de0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
32df0 4e 65 78 74 28 29 0a 20 20 20 20 20 20 20 20 2a  Next().        *
32e00 2a 20 63 61 6c 6c 73 20 72 65 73 74 6f 72 65 43  * calls restoreC
32e10 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
32e20 74 6f 20 70 6f 69 6e 74 20 74 68 65 20 63 75 72  to point the cur
32e30 73 6f 72 20 74 6f 20 74 68 65 20 63 6f 70 79 0a  sor to the copy.
32e40 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
32e50 64 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  d on the interna
32e60 6c 20 6e 6f 64 65 2c 20 74 68 65 6e 20 61 64 76  l node, then adv
32e70 61 6e 63 65 73 20 74 6f 20 74 68 65 20 6e 65 78  ances to the nex
32e80 74 20 65 6e 74 72 79 2c 0a 20 20 20 20 20 20 20  t entry,.       
32e90 20 2a 2a 20 77 68 69 63 68 20 68 61 70 70 65 6e   ** which happen
32ea0 73 20 74 6f 20 62 65 20 74 68 65 20 63 6f 70 79  s to be the copy
32eb0 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 6e 20 74   of the key on t
32ec0 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
32ed0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 65 74  ..        ** Net
32ee0 20 65 66 66 65 63 74 3a 20 6c 65 61 66 43 75 72   effect: leafCur
32ef0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 62 61 63   is pointing bac
32f00 6b 20 74 6f 20 74 68 65 20 64 75 70 6c 69 63 61  k to the duplica
32f10 74 65 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20  te cell.        
32f20 2a 2a 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ** that needs to
32f30 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 61 6e 64   be removed, and
32f40 20 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50   the leafCur.apP
32f50 61 67 65 5b 5d 20 61 6e 64 0a 20 20 20 20 20 20  age[] and.      
32f60 20 20 2a 2a 20 6c 65 61 66 43 75 72 2e 61 69 49    ** leafCur.aiI
32f70 64 78 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20  dx[] arrays are 
32f80 63 6f 72 72 65 63 74 2e 0a 20 20 20 20 20 20 20  correct..       
32f90 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 56 41 5f   */.        VVA_
32fa0 4f 4e 4c 59 28 20 50 67 6e 6f 20 6c 65 61 66 50  ONLY( Pgno leafP
32fb0 67 6e 6f 20 3d 20 70 4c 65 61 66 50 61 67 65 2d  gno = pLeafPage-
32fc0 3e 70 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20  >pgno );.       
32fd0 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
32fe0 50 6f 73 69 74 69 6f 6e 28 26 6c 65 61 66 43 75  Position(&leafCu
32ff0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
33000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33010 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33020 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
33030 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55  (&leafCur, &notU
33040 73 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sed);.        }.
33050 20 20 20 20 20 20 20 20 70 4c 65 61 66 50 61 67          pLeafPag
33060 65 20 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61  e = leafCur.apPa
33070 67 65 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65  ge[leafCur.iPage
33080 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
33090 74 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67  t( pLeafPage->pg
330a0 6e 6f 3d 3d 6c 65 61 66 50 67 6e 6f 20 29 3b 0a  no==leafPgno );.
330b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
330c0 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 6c 65  leafCur.aiIdx[le
330d0 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20  afCur.iPage]==0 
330e0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
330f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
33100 3d 72 63 0a 20 20 20 20 20 20 20 26 26 20 53 51  =rc.       && SQ
33110 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
33120 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33130 28 70 4c 65 61 66 50 61 67 65 2d 3e 70 44 62 50  (pLeafPage->pDbP
33140 61 67 65 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  age)) .      ){.
33150 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
33160 28 70 4c 65 61 66 50 61 67 65 2c 20 30 2c 20 73  (pLeafPage, 0, s
33170 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zNext);.        
33180 56 56 41 5f 4f 4e 4c 59 28 20 6c 65 61 66 43 75  VVA_ONLY( leafCu
33190 72 2e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  r.pagesShuffled 
331a0 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  = 0 );.        r
331b0 63 20 3d 20 62 61 6c 61 6e 63 65 28 26 6c 65 61  c = balance(&lea
331c0 66 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  fCur, 0);.      
331d0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 75    assert( leafCu
331e0 72 73 6f 72 49 6e 76 61 6c 69 64 20 7c 7c 20 21  rsorInvalid || !
331f0 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53 68 75  leafCur.pagesShu
33200 66 66 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20  ffled.          
33210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33220 20 20 20 20 20 20 20 20 20 7c 7c 20 21 70 43 75           || !pCu
33230 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64  r->pagesShuffled
33240 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
33250 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
33260 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
33270 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20  sor(&leafCur);. 
33280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43   }else{.    TRAC
33290 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
332a0 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d  e=%d delete from
332b0 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
332c0 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
332d0 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ot, pPage->pgno)
332e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70  );.    rc = drop
332f0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
33300 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
33310 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
33320 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33330 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
33340 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30   balance(pCur, 0
33350 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
33360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33370 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
33380 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ot(pCur);.  }.  
33390 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
333a0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
333b0 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
333c0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
333d0 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
333e0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
333f0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
33400 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
33410 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
33420 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
33430 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
33440 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
33450 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
33460 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
33470 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
33480 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
33490 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
334a0 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
334b0 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
334c0 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
334d0 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
334e0 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
334f0 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
33500 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
33510 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
33520 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
33530 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74   indices.*/.stat
33540 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61  ic int btreeCrea
33550 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
33560 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
33570 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74  int flags){.  Bt
33580 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
33590 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
335a0 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
335b0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
335c0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
335d0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
335e0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
335f0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
33600 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
33610 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
33620 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
33630 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
33640 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33650 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  UM.  rc = alloca
33660 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
33670 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
33680 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28  ot, 1, 0);.  if(
33690 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
336a0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  n rc;.  }.#else.
336b0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
336c0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
336d0 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
336e0 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
336f0 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  here to make roo
33700 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  m for the root-p
33710 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  age */.    MemPa
33720 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f  ge *pPageMove; /
33730 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f  * The page to mo
33740 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f  ve to. */..    /
33750 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77  * Creating a new
33760 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61   table may proba
33770 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  bly require movi
33780 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64  ng an existing d
33790 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74  atabase.    ** t
337a0 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
337b0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72  the new tables r
337c0 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73  oot page. In cas
337d0 65 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e  e this page turn
337e0 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  s.    ** out to 
337f0 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
33800 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20  age, delete all 
33810 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61  overflow page-ma
33820 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20  p caches.    ** 
33830 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72  held by open cur
33840 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sors..    */.   
33850 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
33860 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
33870 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
33880 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
33890 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
338a0 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
338b0 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
338c0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
338d0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
338e0 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
338f0 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
33900 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
33910 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
33920 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
33930 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
33940 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
33950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
33960 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
33970 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
33980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
339a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
339b0 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20   pgnoRoot++;..  
339c0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f    /* The new roo
339d0 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  t-page may not b
339e0 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61  e allocated on a
339f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
33a00 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e, or the.    **
33a10 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61   PENDING_BYTE pa
33a20 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ge..    */.    w
33a30 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d  hile( pgnoRoot==
33a40 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
33a50 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  t, pgnoRoot) ||.
33a60 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
33a70 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
33a80 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
33a90 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
33aa0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
33ab0 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
33ac0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
33ad0 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
33ae0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
33af0 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
33b00 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
33b10 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
33b20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
33b30 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
33b40 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
33b50 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
33b60 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
33b70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
33b80 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
33b90 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f  ge(pBt, &pPageMo
33ba0 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70  ve, &pgnoMove, p
33bb0 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20  gnoRoot, 1);.   
33bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
33be0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
33bf0 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d    if( pgnoMove!=
33c00 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
33c10 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73    /* pgnoRoot is
33c20 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77   the page that w
33c30 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
33c40 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
33c50 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
33c60 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e  w table (assumin
33c70 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e  g an error did n
33c80 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77  ot occur). But w
33c90 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20  e were.      ** 
33ca0 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f  allocated pgnoMo
33cb0 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20  ve. If required 
33cc0 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20  (i.e. if it was 
33cd0 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  not allocated.  
33ce0 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64      ** by extend
33cf0 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74  ing the file), t
33d00 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
33d10 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f  at position pgno
33d20 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Move.      ** is
33d30 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c   already journal
33d40 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
33d50 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
33d60 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
33d70 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
33d80 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
33d90 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
33da0 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
33db0 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74  ly at pgnoRoot t
33dc0 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20  o pgnoMove. */. 
33dd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33de0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
33df0 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
33e00 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  oot, 0);.      i
33e10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33e20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
33e30 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
33e40 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
33e50 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Get(pBt, pgnoRoo
33e60 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  t, &eType, &iPtr
33e70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
33e80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
33e90 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
33ea0 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70  ROOTPAGE || eTyp
33eb0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
33ec0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  GE ){.        re
33ed0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
33ee0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
33ef0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
33f00 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
33f10 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
33f20 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
33f30 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
33f40 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20  _FREEPAGE );.   
33f50 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
33f60 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c  Page(pBt, pRoot,
33f70 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
33f80 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a  , pgnoMove, 0);.
33f90 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
33fa0 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20  e(pRoot);..     
33fb0 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70   /* Obtain the p
33fc0 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  age at pgnoRoot 
33fd0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  */.      if( rc!
33fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
34000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
34010 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
34020 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
34030 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
34040 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
34050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34060 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
34070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
34080 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34090 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
340a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
340b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
340c0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
340d0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
340e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
340f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
34100 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
34110 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
34120 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
34130 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
34140 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
34150 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
34160 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
34170 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
34180 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
34190 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
341a0 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
341b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
341c0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
341d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
341e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
341f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
34200 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
34210 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
34220 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
34230 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
34240 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
34250 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
34260 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
34270 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
34280 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
34290 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
342a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
342b0 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
342c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
342d0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
342e0 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
342f0 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
34300 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50  pRoot, flags | P
34310 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69  TF_LEAF);.  sqli
34320 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52  te3PagerUnref(pR
34330 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
34340 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74   *piTable = (int
34350 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74  )pgnoRoot;.  ret
34360 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34370 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
34380 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
34390 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
343a0 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
343b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
343c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
343d0 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20  );.  p->pBt->db 
343e0 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20  = p->db;.  rc = 
343f0 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
34400 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61  (p, piTable, fla
34410 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
34420 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
34430 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
34440 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76  ** Erase the giv
34450 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
34460 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69   and all its chi
34470 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a  ldren.  Return.*
34480 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  * the page to th
34490 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73  e freelist..*/.s
344a0 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44  tatic int clearD
344b0 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42  atabasePage(.  B
344c0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
344d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
344e0 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Tree that contai
344f0 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ns the table */.
34500 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
34510 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
34520 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20  number to clear 
34530 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67  */.  int freePag
34540 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a 20 44 65  eFlag,     /* De
34550 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66  allocate page if
34560 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   true */.  int *
34570 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65  pnChange.){.  Me
34580 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
34590 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
345a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
345b0 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ll;.  int i;..  
345c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
345d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
345e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
345f0 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  pgno>pagerPageco
34600 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
34610 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
34620 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
34630 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
34640 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
34650 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
34660 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
34670 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
34680 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
34690 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
346a0 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  ){.    pCell = f
346b0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
346c0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
346d0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
346e0 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
346f0 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
34700 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c  4byte(pCell), 1,
34710 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20   pnChange);.    
34720 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34730 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
34740 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
34750 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
34760 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
34770 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
34780 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
34790 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
347a0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
347b0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
347c0 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
347d0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
347e0 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c  e->aData[8]), 1,
347f0 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20   pnChange);.    
34800 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
34810 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
34820 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  out;.  }else if(
34830 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a 20 20 20   pnChange ){.   
34840 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
34850 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70  intKey );.    *p
34860 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50 61 67 65  nChange += pPage
34870 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69  ->nCell;.  }.  i
34880 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20  f( freePageFlag 
34890 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
348a0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
348b0 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73  else if( (rc = s
348c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
348d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
348e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f  )==0 ){.    zero
348f0 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
34900 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54  e->aData[0] | PT
34910 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c  F_LEAF);.  }..cl
34920 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
34930 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
34940 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
34950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
34960 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f   Delete all info
34970 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73  rmation from a s
34980 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
34990 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54  he database.  iT
349a0 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70  able is.** the p
349b0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
349c0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
349d0 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73  ble.  After this
349e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
349f0 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  ,.** the root pa
34a00 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74  ge is empty, but
34a10 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a   still exists..*
34a20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
34a30 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
34a40 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
34a50 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
34a60 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72  open.** read cur
34a70 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
34a80 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63  e.  Open write c
34a90 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64  ursors are moved
34aa0 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   to the.** root 
34ab0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
34ac0 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e 67 65 20  .** If pnChange 
34ad0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
34ae0 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 6d  n table iTable m
34af0 75 73 74 20 62 65 20 61 6e 20 69 6e 74 6b 65 79  ust be an intkey
34b00 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 69   table. The.** i
34b10 6e 74 65 67 65 72 20 76 61 6c 75 65 20 70 6f 69  nteger value poi
34b20 6e 74 65 64 20 74 6f 20 62 79 20 70 6e 43 68 61  nted to by pnCha
34b30 6e 67 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  nge is increment
34b40 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
34b50 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69   of.** entries i
34b60 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
34b70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
34b80 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65  ClearTable(Btree
34b90 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
34ba0 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 29 7b   int *pnChange){
34bb0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
34bc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
34bd0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
34be0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
34bf0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
34c00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
34c10 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
34c20 45 20 29 3b 0a 20 20 69 66 28 20 28 72 63 20 3d  E );.  if( (rc =
34c30 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e   checkForReadCon
34c40 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
34c50 2c 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  , 0, 1))!=SQLITE
34c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  _OK ){.    /* no
34c70 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
34c80 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
34c90 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
34ca0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
34cb0 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20  iTable, 0)) ){. 
34cc0 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
34cd0 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a   do */.  }else{.
34ce0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
34cf0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
34d00 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c  (Pgno)iTable, 0,
34d10 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a   pnChange);.  }.
34d20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
34d30 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
34d40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
34d50 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ase all informat
34d60 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61  ion in a table a
34d70 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20  nd add the root 
34d80 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a  of the table to.
34d90 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
34da0 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f    Except, the ro
34db0 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69  ot of the princi
34dc0 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f  ple table (the o
34dd0 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29  ne on.** page 1)
34de0 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20   is never added 
34df0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
34e00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
34e10 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
34e20 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
34e30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
34e40 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  y open.** cursor
34e50 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
34e60 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  **.** If AUTOVAC
34e70 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61  UUM is enabled a
34e80 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69  nd the page at i
34e90 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65  Table is not the
34ea0 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61   last.** root pa
34eb0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
34ec0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
34ed0 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
34ee0 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61   .** in the data
34ef0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76  base file is mov
34f00 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74  ed into the slot
34f10 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
34f20 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20  ed by.** iTable 
34f30 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c  and that last sl
34f40 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
34f50 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74  pied by the last
34f60 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
34f70 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
34f80 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f  eelist instead o
34f90 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68  f iTable.  In th
34fa0 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72  is say, all.** r
34fb0 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65  oot pages are ke
34fc0 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  pt at the beginn
34fd0 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
34fe0 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a  ase file, which.
34ff0 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ** is necessary 
35000 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74  for AUTOVACUUM t
35010 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a  o work right.  *
35020 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
35030 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e  o the .** page n
35040 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20  umber that used 
35050 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72  to be the last r
35060 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
35070 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  file before.** t
35080 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20  he move.  If no 
35090 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c  page gets moved,
350a0 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
350b0 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61   to 0..** The la
350c0 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  st root page is 
350d0 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61  recorded in meta
350e0 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75  [3] and the valu
350f0 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20  e of.** meta[3] 
35100 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
35110 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f  is procedure..*/
35120 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
35130 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
35140 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
35150 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
35160 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
35170 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
35180 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
35190 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
351a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
351b0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
351c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
351d0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
351e0 52 49 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 74  RITE );..  /* It
351f0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64   is illegal to d
35200 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61  rop a table if a
35210 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f  ny cursors are o
35220 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  pen on the.  ** 
35230 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
35240 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74  s because in aut
35250 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68  o-vacuum mode th
35260 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20  e backend may.  
35270 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  ** need to move 
35280 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67  another root-pag
35290 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20  e to fill a gap 
352a0 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
352b0 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61  ted.  ** root pa
352c0 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63  ge. If an open c
352d0 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20  ursor was using 
352e0 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62  this page a prob
352f0 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20  lem would .  ** 
35300 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  occur..  */.  if
35310 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29  ( pBt->pCursor )
35320 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
35330 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
35340 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 43 75 72 73  ->db, pBt->pCurs
35350 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b  or->pBtree->db);
35360 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
35370 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
35380 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  CACHE;.  }..  rc
35390 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
353a0 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
353b0 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65  o)iTable, &pPage
353c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
353d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
353e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
353f0 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61  learTable(p, iTa
35400 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ble, 0);.  if( r
35410 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  c ){.    release
35420 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
35430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
35440 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b  .  *piMoved = 0;
35450 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31  ..  if( iTable>1
35460 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
35470 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
35480 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  M.    rc = freeP
35490 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
354a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
354b0 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  e);.#else.    if
354c0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
354d0 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  m ){.      Pgno 
354e0 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20  maxRootPgno;.   
354f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
35500 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34  treeGetMeta(p, 4
35510 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  , &maxRootPgno);
35520 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
35530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35540 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35550 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35560 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
35570 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54   }..      if( iT
35580 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e  able==maxRootPgn
35590 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
355a0 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  If the table bei
355b0 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68  ng dropped is th
355c0 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
355d0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
355e0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
355f0 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  mber in the data
35600 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f  base, put the ro
35610 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66  ot page on the f
35620 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ree list. .     
35630 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
35640 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
35650 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
35660 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
35670 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
35680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35690 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
356a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
356b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
356c0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
356d0 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73  ing dropped does
356e0 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61   not have the la
356f0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
35700 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
35710 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
35720 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70  e. So move the p
35730 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e  age that does in
35740 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
35750 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74  ** gap left by t
35760 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d  he deleted root-
35770 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  page..        */
35780 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
35790 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20   *pMove;.       
357a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
357b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ge);.        rc 
357c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
357d0 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f  tPage(pBt, maxRo
357e0 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20  otPgno, &pMove, 
357f0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
35800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35810 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
35820 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
35830 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
35840 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
35850 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Move, PTRMAP_ROO
35860 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65  TPAGE, 0, iTable
35870 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
35880 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
35890 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
358a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
358b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
358c0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
358d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
358e0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
358f0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
35900 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
35910 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
35920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35930 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35950 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
35960 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Move);.        r
35970 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
35980 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
35990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
359a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
359b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
359c0 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20         *piMoved 
359d0 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  = maxRootPgno;. 
359e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
359f0 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61   Set the new 'ma
35a00 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c  x-root-page' val
35a10 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ue in the databa
35a20 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a  se header. This.
35a30 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
35a40 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f  old value less o
35a50 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72  ne, less one mor
35a60 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e  e if that happen
35a70 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
35a80 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d   a root-page num
35a90 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67  ber, less one ag
35aa0 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74  ain if that is t
35ab0 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44  he.      ** PEND
35ac0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20  ING_BYTE_PAGE.. 
35ad0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61       */.      ma
35ae0 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
35af0 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
35b00 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
35b10 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
35b20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
35b30 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
35b40 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
35b50 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  no==PTRMAP_PAGEN
35b60 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  O(pBt, maxRootPg
35b70 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  no) ){.        m
35b80 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
35b90 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
35ba0 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21  rt( maxRootPgno!
35bb0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
35bc0 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  GE(pBt) );..    
35bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
35be0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
35bf0 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29   4, maxRootPgno)
35c00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35c10 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
35c20 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  (pPage);.      r
35c30 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
35c40 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
35c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
35c60 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  If sqlite3BtreeD
35c70 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c  ropTable was cal
35c80 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  led on page 1. *
35c90 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  /.    zeroPage(p
35ca0 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59  Page, PTF_INTKEY
35cb0 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20  |PTF_LEAF );.   
35cc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
35cd0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
35ce0 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71  n rc;  .}.int sq
35cf0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
35d00 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
35d10 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
35d20 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
35d30 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
35d40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
35d50 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
35d60 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f  .  rc = btreeDro
35d70 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65  pTable(p, iTable
35d80 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71  , piMoved);.  sq
35d90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
35da0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
35db0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
35dc0 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  the meta-informa
35dd0 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61  tion out of a da
35de0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65  tabase file.  Me
35df0 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20  ta[0].** is the 
35e00 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  number of free p
35e10 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
35e20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
35e30 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f   Meta[1].** thro
35e40 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65  ugh meta[15] are
35e50 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
35e60 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79  se by higher lay
35e70 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a  ers.  Meta[0].**
35e80 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74   is read-only, t
35e90 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65  he others are re
35ea0 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a  ad/write..** .**
35eb0 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65   The schema laye
35ec0 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76  r numbers meta v
35ed0 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c  alues differentl
35ee0 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d  y.  At the schem
35ef0 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20  a.** layer (and 
35f00 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e  the SetCookie an
35f10 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63  d ReadCookie opc
35f20 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72  odes) the number
35f30 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65   of.** free page
35f40 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65  s is not visible
35f50 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20  .  So Cookie[0] 
35f60 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d  is the same as M
35f70 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73  eta[1]..*/.int s
35f80 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
35f90 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
35fa0 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61   idx, u32 *pMeta
35fb0 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
35fc0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
35fd0 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
35fe0 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68  har *pP1;.  BtSh
35ff0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
36000 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
36010 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
36020 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
36030 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20  .  /* Reading a 
36040 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20  meta-data value 
36050 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  requires a read-
36060 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28  lock on page 1 (
36070 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74  and hence.  ** t
36080 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
36090 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20   table. We grab 
360a0 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64  this lock regard
360b0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
360c0 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  or.  ** not the 
360d0 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
360e0 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
360f0 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f  et (the table ro
36100 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a  oted at page.  *
36110 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20 61  * 1 is treated a
36120 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
36130 20 62 79 20 71 75 65 72 79 53 68 61 72 65 64 43   by querySharedC
36140 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 0a  acheTableLock().
36150 20 20 2a 2a 20 61 6e 64 20 73 65 74 53 68 61 72    ** and setShar
36160 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
36170 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ())..  */.  rc =
36180 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
36190 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c  eTableLock(p, 1,
361a0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
361b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
361c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
361d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
361e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
361f0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
36200 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =0 && idx<=15 );
36210 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
36220 65 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  e1 ){.    /* The
36230 20 62 2d 74 72 65 65 20 69 73 20 61 6c 72 65 61   b-tree is alrea
36240 64 79 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  dy holding a ref
36250 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
36260 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
36270 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 49 6e  .    ** file. In
36280 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72   this case the r
36290 65 71 75 69 72 65 64 20 6d 65 74 61 2d 64 61 74  equired meta-dat
362a0 61 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 72  a value can be r
362b0 65 61 64 20 64 69 72 65 63 74 6c 79 0a 20 20 20  ead directly.   
362c0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 61 67   ** from the pag
362d0 65 20 64 61 74 61 20 6f 66 20 74 68 69 73 20 72  e data of this r
362e0 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 69  eference. This i
362f0 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65  s slightly faste
36300 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 72 65  r than.    ** re
36310 71 75 65 73 74 69 6e 67 20 61 20 6e 65 77 20 72  questing a new r
36320 65 66 65 72 65 6e 63 65 20 66 72 6f 6d 20 74 68  eference from th
36330 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20  e pager layer.. 
36340 20 20 20 2a 2f 0a 20 20 20 20 70 50 31 20 3d 20     */.    pP1 = 
36350 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
36360 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
36370 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ata;.  }else{.  
36380 20 20 2f 2a 20 54 68 65 20 62 2d 74 72 65 65 20    /* The b-tree 
36390 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
363a0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
363b0 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
363c0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  ase file..    **
363d0 20 4f 62 74 61 69 6e 20 6f 6e 65 20 66 72 6f 6d   Obtain one from
363e0 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
363f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
36400 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
36410 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31  t(pBt->pPager, 1
36420 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
36430 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
36440 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
36450 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
36460 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
36470 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65    pP1 = (unsigne
36480 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  d char *)sqlite3
36490 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
364a0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d  Page);.  }.  *pM
364b0 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26  eta = get4byte(&
364c0 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29  pP1[36 + idx*4])
364d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
364e0 2d 74 72 65 65 20 69 73 20 6e 6f 74 20 68 6f 6c  -tree is not hol
364f0 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
36500 20 74 6f 20 70 61 67 65 20 31 2c 20 74 68 65 6e   to page 1, then
36510 20 6f 6e 65 20 77 61 73 20 0a 20 20 2a 2a 20 72   one was .  ** r
36520 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
36530 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 6e  e pager layer in
36540 20 74 68 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b   the above block
36550 2e 20 52 65 6c 65 61 73 65 20 69 74 20 6e 6f 77  . Release it now
36560 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  ..  */.  if( !pB
36570 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20 20 20  t->pPage1 ){.   
36580 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
36590 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ef(pDbPage);.  }
365a0 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61  ..  /* If autova
365b0 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c  cuumed is disabl
365c0 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
365d0 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69   but we are tryi
365e0 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65  ng to .  ** acce
365f0 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d  ss an autovacuum
36600 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
36610 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62  n make the datab
36620 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20  ase readonly. . 
36630 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
36640 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
36650 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26  M.  if( idx==4 &
36660 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74  & *pMeta>0 ) pBt
36670 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
36680 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61  #endif..  /* Gra
36690 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  b the read-lock 
366a0 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
366b0 72 63 20 3d 20 73 65 74 53 68 61 72 65 64 43 61  rc = setSharedCa
366c0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
366d0 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
366e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
366f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
36700 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
36710 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  te meta-informat
36720 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ion back into th
36730 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
36740 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d  a[0] is.** read-
36750 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74  only and may not
36760 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a   be written..*/.
36770 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
36780 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65  UpdateMeta(Btree
36790 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33   *p, int idx, u3
367a0 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68  2 iMeta){.  BtSh
367b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
367c0 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
367d0 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20  har *pP1;.  int 
367e0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
367f0 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=1 && idx<=15 
36800 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
36810 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
36820 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
36830 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
36840 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
36850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
36860 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20  ->pPage1!=0 );. 
36870 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
36880 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  e1->aData;.  rc 
36890 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
368a0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
368b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
368c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
368d0 7b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  {.    put4byte(&
368e0 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c  pP1[36 + idx*4],
368f0 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65 66   iMeta);.#ifndef
36900 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36910 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
36920 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  idx==7 ){.      
36930 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
36940 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61  oVacuum || iMeta
36950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
36960 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c  ert( iMeta==0 ||
36970 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20   iMeta==1 );.   
36980 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
36990 75 6d 20 3d 20 28 75 38 29 69 4d 65 74 61 3b 0a  um = (u8)iMeta;.
369a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
369b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
369c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
369d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
369e0 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62  eturn the flag b
369f0 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e  yte at the begin
36a00 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65  ning of the page
36a10 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
36a20 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
36a30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
36a40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
36a50 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  eFlags(BtCursor 
36a60 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
36a70 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55  O: What about CU
36a80 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
36a90 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79   state? Probably
36aa0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20   need to call.  
36ab0 2a 2a 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ** restoreCursor
36ac0 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e  Position() here.
36ad0 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  .  */.  MemPage 
36ae0 2a 70 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72  *pPage;.  restor
36af0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
36b00 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d  pCur);.  pPage =
36b10 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
36b20 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
36b30 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
36b40 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
36b50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
36b60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
36b70 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72  pPage->pBt==pCur
36b80 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75 72  ->pBt );.  retur
36b90 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  n pPage->aData[p
36ba0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d  Page->hdrOffset]
36bb0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
36bc0 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
36bd0 55 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  UNT./*.** The fi
36be0 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 70 43  rst argument, pC
36bf0 75 72 2c 20 69 73 20 61 20 63 75 72 73 6f 72 20  ur, is a cursor 
36c00 6f 70 65 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 62  opened on some b
36c10 2d 74 72 65 65 2e 20 43 6f 75 6e 74 20 74 68 65  -tree. Count the
36c20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  .** number of en
36c30 74 72 69 65 73 20 69 6e 20 74 68 65 20 62 2d 74  tries in the b-t
36c40 72 65 65 20 61 6e 64 20 77 72 69 74 65 20 74 68  ree and write th
36c50 65 20 72 65 73 75 6c 74 20 74 6f 20 2a 70 6e 45  e result to *pnE
36c60 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ntry..**.** SQLI
36c70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
36c80 64 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  d if the operati
36c90 6f 6e 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  on is successful
36ca0 6c 79 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a  ly executed. .**
36cb0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
36cc0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
36cd0 6e 74 65 72 65 64 20 28 69 2e 65 2e 20 61 6e 20  ntered (i.e. an 
36ce0 49 4f 20 65 72 72 6f 72 20 6f 72 20 64 61 74 61  IO error or data
36cf0 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
36d00 6f 6e 29 20 61 6e 20 53 51 4c 69 74 65 20 65 72  on) an SQLite er
36d10 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
36d20 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
36d30 69 74 65 33 42 74 72 65 65 43 6f 75 6e 74 28 42  ite3BtreeCount(B
36d40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
36d50 36 34 20 2a 70 6e 45 6e 74 72 79 29 7b 0a 20 20  64 *pnEntry){.  
36d60 69 36 34 20 6e 45 6e 74 72 79 20 3d 20 30 3b 20  i64 nEntry = 0; 
36d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d80 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
36d90 20 72 65 74 75 72 6e 20 69 6e 20 2a 70 6e 45 6e   return in *pnEn
36da0 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  try */.  int rc;
36db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36dd0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
36de0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
36df0 74 28 70 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 55  t(pCur);..  /* U
36e00 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 6f  nless an error o
36e10 63 63 75 72 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  ccurs, the follo
36e20 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
36e30 6e 65 20 69 74 65 72 61 74 69 6f 6e 20 66 6f 72  ne iteration for
36e40 20 65 61 63 68 0a 20 20 2a 2a 20 70 61 67 65 20   each.  ** page 
36e50 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 73 74  in the B-Tree st
36e60 72 75 63 74 75 72 65 20 28 6e 6f 74 20 69 6e 63  ructure (not inc
36e70 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  luding overflow 
36e80 70 61 67 65 73 29 2e 20 0a 20 20 2a 2f 0a 20 20  pages). .  */.  
36e90 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
36ea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
36eb0 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
36ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36ed0 2a 20 49 6e 64 65 78 20 6f 66 20 63 68 69 6c 64  * Index of child
36ee0 20 6e 6f 64 65 20 69 6e 20 70 61 72 65 6e 74 20   node in parent 
36ef0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
36f00 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
36f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
36f20 72 65 6e 74 20 70 61 67 65 20 6f 66 20 74 68 65  rent page of the
36f30 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
36f40 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
36f50 6c 65 61 66 20 70 61 67 65 20 6f 72 20 74 68 65  leaf page or the
36f60 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61 6e 20   tree is not an 
36f70 69 6e 74 2d 6b 65 79 20 74 72 65 65 2c 20 74 68  int-key tree, th
36f80 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  en .    ** this 
36f90 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f  page contains co
36fa0 75 6e 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e  untable entries.
36fb0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 65   Increment the e
36fc0 6e 74 72 79 20 63 6f 75 6e 74 65 72 0a 20 20 20  ntry counter.   
36fd0 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e   ** accordingly.
36fe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
36ff0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
37000 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
37010 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
37020 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e  af || !pPage->in
37030 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 45  tKey ){.      nE
37040 6e 74 72 79 20 2b 3d 20 70 50 61 67 65 2d 3e 6e  ntry += pPage->n
37050 43 65 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cell;.    }..   
37060 20 2f 2a 20 70 50 61 67 65 20 69 73 20 61 20 6c   /* pPage is a l
37070 65 61 66 20 6e 6f 64 65 2e 20 54 68 69 73 20 6c  eaf node. This l
37080 6f 6f 70 20 6e 61 76 69 67 61 74 65 73 20 74 68  oop navigates th
37090 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
370a0 20 69 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e   it .    ** poin
370b0 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
370c0 69 6e 74 65 72 69 6f 72 20 63 65 6c 6c 20 74 68  interior cell th
370d0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
370e0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 0a 20 20  the parent of.  
370f0 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 70 61    ** the next pa
37100 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 20 74  ge in the tree t
37110 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  hat has not yet 
37120 62 65 65 6e 20 76 69 73 69 74 65 64 2e 20 54 68  been visited. Th
37130 65 0a 20 20 20 20 2a 2a 20 70 43 75 72 2d 3e 61  e.    ** pCur->a
37140 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
37150 5d 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  ] value is set t
37160 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
37170 68 65 20 70 61 72 65 6e 74 20 63 65 6c 6c 0a 20  he parent cell. 
37180 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
37190 65 2c 20 6f 72 20 74 6f 20 74 68 65 20 6e 75 6d  e, or to the num
371a0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
371b0 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
371c0 6e 65 78 74 20 70 61 67 65 0a 20 20 20 20 2a 2a  next page.    **
371d0 20 74 6f 20 76 69 73 69 74 20 69 73 20 74 68 65   to visit is the
371e0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
371f0 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 20 20  its parent..    
37200 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6c 6c  **.    ** If all
37210 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 74 72   pages in the tr
37220 65 65 20 68 61 76 65 20 62 65 65 6e 20 76 69 73  ee have been vis
37230 69 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ited, return SQL
37240 49 54 45 5f 4f 4b 20 74 6f 20 74 68 65 0a 20 20  ITE_OK to the.  
37250 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20    ** caller..   
37260 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
37270 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
37280 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 69 66   do {.        if
37290 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
372a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
372b0 20 41 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   All pages of th
372c0 65 20 62 2d 74 72 65 65 20 68 61 76 65 20 62 65  e b-tree have be
372d0 65 6e 20 76 69 73 69 74 65 64 2e 20 52 65 74 75  en visited. Retu
372e0 72 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  rn successfully.
372f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2a 70   */.          *p
37300 6e 45 6e 74 72 79 20 3d 20 6e 45 6e 74 72 79 3b  nEntry = nEntry;
37310 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
37320 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
37330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
37340 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
37350 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
37360 20 20 20 20 20 7d 77 68 69 6c 65 20 28 20 70 43       }while ( pC
37370 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
37380 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70  iPage]>=pCur->ap
37390 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
373a0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 20  ]->nCell );..   
373b0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
373c0 43 75 72 2d 3e 69 50 61 67 65 5d 2b 2b 3b 0a 20  Cur->iPage]++;. 
373d0 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
373e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
373f0 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 0a 0a 20  iPage];.    }.. 
37400 20 20 20 2f 2a 20 44 65 73 63 65 6e 64 20 74 6f     /* Descend to
37410 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65 20   the child node 
37420 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
37430 20 74 68 65 20 63 75 72 73 6f 72 20 63 75 72 72   the cursor curr
37440 65 6e 74 6c 79 20 0a 20 20 20 20 2a 2a 20 70 6f  ently .    ** po
37450 69 6e 74 73 20 61 74 2e 20 54 68 69 73 20 69 73  ints at. This is
37460 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
37470 20 69 66 20 28 69 49 64 78 3d 3d 70 50 61 67 65   if (iIdx==pPage
37480 2d 3e 6e 43 65 6c 6c 29 2e 0a 20 20 20 20 2a 2f  ->nCell)..    */
37490 0a 20 20 20 20 69 49 64 78 20 3d 20 70 43 75 72  .    iIdx = pCur
374a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
374b0 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 69 49  age];.    if( iI
374c0 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx==pPage->nCell
374d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
374e0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
374f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
37500 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
37510 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
37520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37530 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
37540 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
37550 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
37560 69 49 64 78 29 29 29 3b 0a 20 20 20 20 7d 0a 20  iIdx)));.    }. 
37570 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 65 72 72 6f   }..  /* An erro
37580 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  r has occurred. 
37590 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
375a0 63 6f 64 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72  code. */.  retur
375b0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
375c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
375d0 20 70 61 67 65 72 20 61 73 73 6f 63 69 61 74 65   pager associate
375e0 64 20 77 69 74 68 20 61 20 42 54 72 65 65 2e 20  d with a BTree. 
375f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
37600 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
37610 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
37620 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65  ng only..*/.Page
37630 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50  r *sqlite3BtreeP
37640 61 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0a  ager(Btree *p){.
37650 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
37660 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e  >pPager;.}..#ifn
37670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37680 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
37690 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d  /*.** Append a m
376a0 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 65 72  essage to the er
376b0 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
376c0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
376d0 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73  id checkAppendMs
376e0 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  g(.  IntegrityCk
376f0 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72   *pCheck,.  char
37700 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74   *zMsg1,.  const
37710 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a   char *zFormat,.
37720 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69    ....){.  va_li
37730 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 43  st ap;.  if( !pC
37740 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65  heck->mxErr ) re
37750 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  turn;.  pCheck->
37760 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63  mxErr--;.  pChec
37770 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f  k->nErr++;.  va_
37780 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
37790 74 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b  t);.  if( pCheck
377a0 2d 3e 65 72 72 4d 73 67 2e 6e 43 68 61 72 20 29  ->errMsg.nChar )
377b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  {.    sqlite3Str
377c0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70 43 68  AccumAppend(&pCh
377d0 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e  eck->errMsg, "\n
377e0 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ", 1);.  }.  if(
377f0 20 7a 4d 73 67 31 20 29 7b 0a 20 20 20 20 73 71   zMsg1 ){.    sq
37800 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
37810 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65 72 72  end(&pCheck->err
37820 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b  Msg, zMsg1, -1);
37830 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 58  .  }.  sqlite3VX
37840 50 72 69 6e 74 66 28 26 70 43 68 65 63 6b 2d 3e  Printf(&pCheck->
37850 65 72 72 4d 73 67 2c 20 31 2c 20 7a 46 6f 72 6d  errMsg, 1, zForm
37860 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
37870 64 28 61 70 29 3b 0a 20 20 69 66 28 20 70 43 68  d(ap);.  if( pCh
37880 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c  eck->errMsg.mall
37890 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
378a0 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61  pCheck->mallocFa
378b0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  iled = 1;.  }.}.
378c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
378d0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
378e0 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
378f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
37900 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
37910 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65  .** Add 1 to the
37920 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
37930 20 66 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e   for page iPage.
37940 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
37950 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72   second.** refer
37960 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
37970 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d  , add an error m
37980 65 73 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b  essage to pCheck
37990 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65  ->zErrMsg..** Re
379a0 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20  turn 1 if there 
379b0 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72  are 2 ore more r
379c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
379d0 20 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a   page and 0 if.*
379e0 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
379f0 20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63 65   first reference
37a00 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   to the page..**
37a10 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74  .** Also check t
37a20 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
37a30 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73  ber is in bounds
37a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37a50 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69  checkRef(Integri
37a60 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 50 67  tyCk *pCheck, Pg
37a70 6e 6f 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a  no iPage, char *
37a80 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28  zContext){.  if(
37a90 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75   iPage==0 ) retu
37aa0 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67  rn 1;.  if( iPag
37ab0 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20  e>pCheck->nPage 
37ac0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
37ad0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
37ae0 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64  ontext, "invalid
37af0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22   page number %d"
37b00 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
37b10 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
37b20 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b  ( pCheck->anRef[
37b30 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20  iPage]==1 ){.   
37b40 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
37b50 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
37b60 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65  , "2nd reference
37b70 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50   to page %d", iP
37b80 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
37b90 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
37ba0 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66    (pCheck->anRef
37bb0 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a  [iPage]++)>1;.}.
37bc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37bd0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
37be0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
37bf0 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68   the entry in th
37c00 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f  e pointer-map fo
37c10 72 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61  r page iChild ma
37c20 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69  ps to .** page i
37c30 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20  Parent, pointer 
37c40 74 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66  type ptrType. If
37c50 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20   not, append an 
37c60 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
37c70 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73   to pCheck..*/.s
37c80 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
37c90 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72  Ptrmap(.  Integr
37ca0 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
37cb0 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68   /* Integrity ch
37cc0 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  eck context */. 
37cd0 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
37ce0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64          /* Child
37cf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
37d00 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
37d10 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
37d20 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
37d30 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   type */.  Pgno 
37d40 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  iParent,        
37d50 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f    /* Expected po
37d60 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74  inter map parent
37d70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
37d80 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
37d90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
37da0 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
37db0 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20  (used for error 
37dc0 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  msg) */.){.  int
37dd0 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61   rc;.  u8 ePtrma
37de0 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pType;.  Pgno iP
37df0 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20  trmapParent;..  
37e00 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
37e10 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69  Check->pBt, iChi
37e20 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65  ld, &ePtrmapType
37e30 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74  , &iPtrmapParent
37e40 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
37e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
37e60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
37e70 45 4d 20 29 20 70 43 68 65 63 6b 2d 3e 6d 61 6c  EM ) pCheck->mal
37e80 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
37e90 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
37ea0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
37eb0 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72  xt, "Failed to r
37ec0 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25  ead ptrmap key=%
37ed0 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  d", iChild);.   
37ee0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
37ef0 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 65 21  if( ePtrmapType!
37f00 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61  =eType || iPtrma
37f10 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74  pParent!=iParent
37f20 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
37f30 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
37f40 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
37f50 22 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74  "Bad ptr map ent
37f60 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74  ry key=%d expect
37f70 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28  ed=(%d,%d) got=(
37f80 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20  %d,%d)", .      
37f90 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69  iChild, eType, i
37fa0 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54  Parent, ePtrmapT
37fb0 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65  ype, iPtrmapPare
37fc0 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  nt);.  }.}.#endi
37fd0 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  f../*.** Check t
37fe0 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
37ff0 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20  the freelist or 
38000 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
38010 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72  age list..** Ver
38020 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
38030 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
38040 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a  the list is N..*
38050 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
38060 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67  eckList(.  Integ
38070 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
38080 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68   /* Integrity ch
38090 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  ecking context *
380a0 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69  /.  int isFreeLi
380b0 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75  st,       /* Tru
380c0 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74  e for a freelist
380d0 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65  .  False for ove
380e0 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20  rflow page list 
380f0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20  */.  int iPage, 
38100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
38110 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69  ge number for fi
38120 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  rst page in the 
38130 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  list */.  int N,
38140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38150 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62  /* Expected numb
38160 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
38170 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61  he list */.  cha
38180 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20  r *zContext     
38190 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f     /* Context fo
381a0 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
381b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
381c0 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d    int expected =
381d0 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   N;.  int iFirst
381e0 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c   = iPage;.  whil
381f0 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43  e( N-- > 0 && pC
38200 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20  heck->mxErr ){. 
38210 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c     DbPage *pOvfl
38220 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Page;.    unsign
38230 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61  ed char *pOvflDa
38240 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67  ta;.    if( iPag
38250 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65  e<1 ){.      che
38260 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
38270 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
38280 20 20 20 20 20 20 20 22 25 64 20 6f 66 20 25 64         "%d of %d
38290 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66   pages missing f
382a0 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  rom overflow lis
382b0 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 25 64  t starting at %d
382c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31  ",.          N+1
382d0 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46 69 72  , expected, iFir
382e0 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
382f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
38300 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c  checkRef(pCheck,
38310 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
38320 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  ) ) break;.    i
38330 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  f( sqlite3PagerG
38340 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65  et(pCheck->pPage
38350 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20  r, (Pgno)iPage, 
38360 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20  &pOvflPage) ){. 
38370 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
38380 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
38390 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f  text, "failed to
383a0 20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20 69   get page %d", i
383b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Page);.      bre
383c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  ak;.    }.    pO
383d0 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67  vflData = (unsig
383e0 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74  ned char *)sqlit
383f0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
38400 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69  OvflPage);.    i
38410 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b  f( isFreeList ){
38420 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67  .      int n = g
38430 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61  et4byte(&pOvflDa
38440 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20  ta[4]);.#ifndef 
38450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
38460 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
38470 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61