/ Hex Artifact Content
Login

Artifact d3e38cf751251096c2d2017ff9f2375e29bf0f99:


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 39 38 20 32 30 30 39 2f 30  c,v 1.598 2009/0
0190: 34 2f 32 39 20 31 31 3a 33 31 3a 34 37 20 64 61  4/29 11:31:47 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 30  ite3BtreeTrace=0
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f....#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  CACHE./*.** A li
0450: 73 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f  st of BtShared o
0460: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
0470: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72  eligible for par
0480: 74 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e  ticipation.** in
0490: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
04a0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
04b0: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72  s file scope dur
04c0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  ing normal build
04d0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65  s,.** but the te
04e0: 73 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73  st harness needs
04f0: 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f   to access it so
0500: 20 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62   we make it glob
0510: 61 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20  al for .** test 
0520: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63  builds..**.** Ac
0530: 63 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72  cess to this var
0540: 69 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74  iable is protect
0550: 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54  ed by SQLITE_MUT
0560: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
0570: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0580: 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64  TE_TEST.BtShared
0590: 20 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c   *SQLITE_WSD sql
05a0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
05b0: 69 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ist = 0;.#else.s
05c0: 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a  tatic BtShared *
05d0: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
05e0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05f0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  t = 0;.#endif.#e
0600: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0610: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0620: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0630: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0640: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0650: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0660: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0670: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0680: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0690: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
06a0: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06c0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06d0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06e0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06f0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
0700: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0710: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0720: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0730: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0740: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0750: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0760: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0770: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0780: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0790: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
07a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
07b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
07c0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
07d0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
07e0: 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 52 65 61   int checkForRea
07f0: 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65  dConflicts(Btree
0800: 2a 2c 20 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f  *, Pgno, BtCurso
0810: 72 2a 2c 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64  r*, i64);...#ifd
0820: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0830: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0840: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0850: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0860: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0870: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0880: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0890: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
08a0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
08b0: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
08c0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
08d0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
08e0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
08f0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0900: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0910: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0920: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0930: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0940: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0950: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0960: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0970: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0980: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0990: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
09a0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
09b0: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
09c0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
09d0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
09e0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
09f0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0a00: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0a10: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0a20: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0a30: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0a40: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0a50: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0a60: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0a70: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0a80: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0a90: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 23  eTableLocks(a).#
0aa0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0ab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ac0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51 75  D_CACHE./*.** Qu
0ad0: 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74  ery to see if bt
0ae0: 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79  ree handle p may
0af0: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
0b00: 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a  f type eLock .**
0b10: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
0b20: 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68  RITE_LOCK) on th
0b30: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
0b40: 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74  t-page iTab. Ret
0b50: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
0b60: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79   if the lock may
0b70: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79   be obtained (by
0b80: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53   calling.** setS
0b90: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ba0: 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54  ock()), or SQLIT
0bb0: 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e  E_LOCKED if not.
0bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71  .*/.static int q
0bd0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
0bf0: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
0c00: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
0c10: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
0c20: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
0c30: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
0c40: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
0c50: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
0c60: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
0c70: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
0c80: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
0c90: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
0ca0: 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
0cb0: 72 65 71 75 65 73 74 69 6e 67 20 61 20 77 72 69  requesting a wri
0cc0: 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  te-lock, then th
0cd0: 65 20 42 74 72 65 65 20 6d 75 73 74 20 68 61 76  e Btree must hav
0ce0: 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a  e an open write.
0cf0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
0d00: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41   on this file. A
0d10: 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66  nd, obviously, f
0d20: 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f  or this to be so
0d30: 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73   there .  ** mus
0d40: 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  t be an open wri
0d50: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
0d60: 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  n the file itsel
0d70: 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  f..  */.  assert
0d80: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
0d90: 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70  CK || (p==pBt->p
0da0: 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54  Writer && p->inT
0db0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
0dc0: 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
0dd0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
0de0: 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
0df0: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
0e00: 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  ITE );.  .  /* T
0e10: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
0e20: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
0e30: 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  he is not enable
0e40: 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73  d */.  if( !p->s
0e50: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72  harable ){.    r
0e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0e70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  .  }..  /* If so
0e80: 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
0e90: 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ion is holding a
0ea0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
0eb0: 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65  , the.  ** reque
0ec0: 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f  sted lock may no
0ed0: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20  t be obtained.. 
0ee0: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
0ef0: 57 72 69 74 65 72 21 3d 70 20 26 26 20 70 42 74  Writer!=p && pBt
0f00: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ->isExclusive ){
0f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
0f20: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
0f30: 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65  >db, pBt->pWrite
0f40: 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  r->db);.    retu
0f50: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
0f60: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
0f70: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61 6c  }..  /* This (al
0f80: 6f 6e 67 20 77 69 74 68 20 73 65 74 53 68 61 72  ong with setShar
0f90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0fa0: 28 29 29 20 69 73 20 77 68 65 72 65 0a 20 20 2a  ()) is where.  *
0fb0: 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  * the ReadUncomm
0fc0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 64 65  itted flag is de
0fd0: 61 6c 74 20 77 69 74 68 2e 0a 20 20 2a 2a 20 49  alt with..  ** I
0fe0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
0ff0: 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72  querying for a r
1000: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 61 6e 79 20  ead-lock on any 
1010: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 74 68 65 72  table.  ** other
1020: 20 74 68 61 6e 20 74 68 65 20 73 71 6c 69 74 65   than the sqlite
1030: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 74  _master table (t
1040: 61 62 6c 65 20 31 29 20 61 6e 64 20 69 66 20 74  able 1) and if t
1050: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
1060: 65 64 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  ed.  ** flag is 
1070: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  set, then the lo
1080: 63 6b 20 67 72 61 6e 74 65 64 20 65 76 65 6e 20  ck granted even 
1090: 69 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69  if there are wri
10a0: 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e  te-locks.  ** on
10b0: 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61   the table. If a
10c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72   write-lock is r
10d0: 65 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65  equested, the Re
10e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
10f0: 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63  ag.  ** is not c
1100: 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a  onsidered..  **.
1110: 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e    ** In function
1120: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
1130: 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 69 66 20 61  ableLock(), if a
1140: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65   read-lock is de
1150: 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20 0a  manded and the .
1160: 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69    ** ReadUncommi
1170: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
1180: 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61 64  , no entry is ad
1190: 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73  ded to the locks
11a0: 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74 53   list .  ** (BtS
11b0: 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20  hared.pLock)..  
11c0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61  **.  ** To summa
11d0: 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65 61  rize: If the Rea
11e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
11f0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72  g is set, then r
1200: 65 61 64 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ead cursors.  **
1210: 20 6f 6e 20 6e 6f 6e 2d 73 63 68 65 6d 61 20 74   on non-schema t
1220: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 63 72 65  ables do not cre
1230: 61 74 65 20 6f 72 20 72 65 73 70 65 63 74 20 74  ate or respect t
1240: 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20  able locks. The 
1250: 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 70 72 6f  locking.  ** pro
1260: 63 65 64 75 72 65 20 66 6f 72 20 61 20 77 72 69  cedure for a wri
1270: 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e  te-cursor does n
1280: 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  ot change..  */.
1290: 20 20 69 66 28 20 0a 20 20 20 20 30 3d 3d 28 70    if( .    0==(p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
12b0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
12c0: 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63  ed) || .    eLoc
12d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
12e0: 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45  .    iTab==MASTE
12f0: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1300: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1310: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1320: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1330: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
1340: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
1350: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
1360: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1370: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 20 20 2a  if(...) .      *
1380: 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  * statement is a
1390: 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
13a0: 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  of:.      **.   
13b0: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
13c0: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
13d0: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
13e0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 2a 2a  E_LOCK).      **
13f0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20  .      ** since 
1400: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20  we know that if 
1410: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1420: 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72  K, then no other
1430: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
1440: 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20    ** may hold a 
1450: 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e  WRITE_LOCK on an
1460: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20  y table in this 
1470: 66 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72  file (since ther
1480: 65 20 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  e can.      ** o
1490: 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  nly be a single 
14a0: 77 72 69 74 65 72 29 2e 0a 20 20 20 20 20 20 2a  writer)..      *
14b0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
14c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
14d0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
14e0: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
14f0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
1500: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
1510: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1520: 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74  pBtree==p || pIt
1530: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
1540: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
1550: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1560: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
1570: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
1580: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
1590: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15a0: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
15b0: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
15c0: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
15d0: 20 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b         if( eLock
15e0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a  ==WRITE_LOCK ){.
15f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1600: 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65  ( p==pBt->pWrite
1610: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
1620: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
1630: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1640: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1650: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1660: 43 41 43 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20  CACHE;.      }. 
1670: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1690: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
16a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16b0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
16c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16d0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
16e0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
16f0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1700: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
1710: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
1720: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
1730: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
1740: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
1750: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
1760: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
1770: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
1780: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1790: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
17a0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
17b0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
17c0: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
17d0: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
17e0: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
17f0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
1800: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1810: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
1820: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1830: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1840: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1850: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
1860: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
1870: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
1880: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1890: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
18a0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
18b0: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
18c0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
18d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
18e0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
18f0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1900: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1910: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1920: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1930: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1950: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
1960: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
1970: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1980: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
1990: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  k) );..  /* If t
19a0: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
19b0: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
19c0: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
19d0: 69 73 20 72 65 71 75 65 73 74 65 64 20 6f 6e 0a  is requested on.
19e0: 20 20 2a 2a 20 61 20 6e 6f 6e 2d 73 63 68 65 6d    ** a non-schem
19f0: 61 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  a table, then th
1a00: 65 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  e lock is always
1a10: 20 67 72 61 6e 74 65 64 2e 20 20 52 65 74 75 72   granted.  Retur
1a20: 6e 20 65 61 72 6c 79 0a 20 20 2a 2a 20 77 69 74  n early.  ** wit
1a30: 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65  hout adding an e
1a40: 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74 53 68  ntry to the BtSh
1a50: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e  ared.pLock list.
1a60: 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e   See.  ** commen
1a70: 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75  t in function qu
1a80: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1a90: 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f  bleLock() for mo
1aa0: 72 65 20 69 6e 66 6f 0a 20 20 2a 2a 20 6f 6e 20  re info.  ** on 
1ab0: 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 52 65 61  handling the Rea
1ac0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
1ad0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
1ae0: 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73     (p->db->flags
1af0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1b00: 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20 20 20  mmitted) && .   
1b10: 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f   (eLock==READ_LO
1b20: 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c  CK) &&.    iTabl
1b30: 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  e!=MASTER_ROOT. 
1b40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1b50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1b60: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
1b70: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
1b80: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
1b90: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
1ba0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1bb0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1bc0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1bd0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
1be0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1bf0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
1c00: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
1c10: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
1c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c30: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1c40: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
1c50: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
1c60: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
1c70: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
1c80: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
1c90: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
1ca0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
1cb0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
1cc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
1cd0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
1ce0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
1cf0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1d00: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
1d10: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
1d20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d40: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
1d50: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
1d60: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
1d70: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
1d80: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1d90: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
1da0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
1db0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
1dc0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
1dd0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
1de0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
1df0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
1e00: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1e10: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
1e20: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
1e30: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
1e40: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
1e50: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
1e60: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
1e70: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
1e80: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
1e90: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
1ea0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
1eb0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
1ec0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
1ed0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
1ee0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
1ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f00: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
1f10: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1f20: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
1f30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1f40: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
1f50: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
1f60: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
1f70: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
1f80: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
1f90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1fa0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
1fb0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1fc0: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2a 0a  ee handle p..**.
1fd0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1fe0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 68 61   assumes that ha
1ff0: 6e 64 6c 65 20 70 20 68 61 73 20 61 6e 20 6f 70  ndle p has an op
2000: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
2010: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
2020: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
2030: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 53 68 61  , then the BtSha
2040: 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 76 61  red.isPending va
2050: 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65  riable.** may be
2060: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c 65   incorrectly cle
2070: 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
2080: 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68 61  void clearAllSha
2090: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
20a0: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
20b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20c0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
20d0: 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74   **ppIter = &pBt
20e0: 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65  ->pLock;..  asse
20f0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2100: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2110: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2120: 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70  arable || 0==*pp
2130: 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  Iter );.  assert
2140: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29  ( p->inTrans>0 )
2150: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49  ;..  while( *ppI
2160: 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  ter ){.    BtLoc
2170: 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74  k *pLock = *ppIt
2180: 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
2190: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
21a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
21b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
21c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
21d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
21e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
21f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
2200: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
2210: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
2220: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
2230: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
2240: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
2250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2260: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
2270: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
2280: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  }..  assert( pBt
2290: 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20 7c  ->isPending==0 |
22a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
22b0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
22c0: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
22d0: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
22e0: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
22f0: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
2300: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
2310: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
2320: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
2330: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
2340: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2350: 61 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e 6e 65  alled when conne
2360: 63 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e 63 6c  ction p is concl
2370: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
2380: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2390: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
23a0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
23b0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
23c0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
23d0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
23e0: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
23f0: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
2400: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
2410: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
2420: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
2430: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
2440: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
2450: 20 73 65 74 20 74 68 65 20 69 73 50 65 6e 64 69   set the isPendi
2460: 6e 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20  ng flag to 0..  
2470: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2480: 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72  here is not curr
2490: 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20  ently a writer, 
24a0: 74 68 65 6e 20 42 74 53 68 61 72 65 64 2e 69 73  then BtShared.is
24b0: 50 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20 20 20  Pending must.   
24c0: 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65   ** be zero alre
24d0: 61 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78  ady. So this nex
24e0: 74 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65  t line is harmle
24f0: 73 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ss in that case.
2500: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
2510: 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  >isPending = 0;.
2520: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
2530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2540: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
2550: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
2560: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2570: 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  age);  /* Forwar
2580: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a  d reference */..
2590: 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  /*.** Verify tha
25a0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
25b0: 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  ds a mutex on th
25c0: 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  e BtShared.*/.#i
25d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
25e0: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f  tic int cursorHo
25f0: 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f  ldsMutex(BtCurso
2600: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
2610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2620: 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
2630: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
2640: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2650: 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a  T_INCRBLOB./*.**
2660: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
2670: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2680: 73 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72  st cache for cur
2690: 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79  sor pCur, if any
26a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26b0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
26c0: 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f  lowCache(BtCurso
26d0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
26e0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26f0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2700: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2710: 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
2720: 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2730: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
2740: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
2750: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
2760: 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63   cache for all c
2770: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
2780: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
2790: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
27a0: 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Bt..*/.static vo
27b0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  id invalidateAll
27c0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
27d0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
27e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
27f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2800: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2810: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70  utex) );.  for(p
2820: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2830: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2840: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
2850: 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20  rflowCache(p);. 
2860: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65   }.}.#else.  #de
2870: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
2880: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
2890: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
28a0: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
28b0: 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a  ache(x).#endif..
28c0: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
28d0: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
28e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
28f0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
2900: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
2910: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
2920: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
2930: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
2940: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
2950: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
2960: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
2970: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
2980: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
2990: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
29a0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
29b0: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
29c0: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
29d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
29e0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
29f0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2a00: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
2a10: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
2a20: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
2a30: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
2a40: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
2a50: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
2a60: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
2a70: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2a80: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
2a90: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
2aa0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
2ab0: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
2ac0: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
2ad0: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
2ae0: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
2af0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
2b00: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
2b10: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
2b20: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
2b30: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
2b40: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
2b50: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
2b60: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
2b70: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
2b80: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
2b90: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
2ba0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
2bb0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2bc0: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
2bd0: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
2be0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
2bf0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
2c00: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
2c10: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
2c20: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
2c30: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
2c40: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
2c50: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
2c60: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
2c70: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
2c80: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
2c90: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
2ca0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
2cb0: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
2cc0: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
2cd0: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
2ce0: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
2cf0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
2d00: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
2d10: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
2d20: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
2d30: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
2d40: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
2d50: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
2d60: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
2d70: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
2d80: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
2d90: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
2da0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
2db0: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
2dc0: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
2dd0: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
2de0: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
2df0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
2e00: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
2e10: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
2e20: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
2e30: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
2e40: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
2e50: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
2e60: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
2e70: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
2e80: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
2e90: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
2ea0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
2eb0: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
2ec0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
2ed0: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
2ee0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
2ef0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
2f00: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
2f10: 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74   above is ommitt
2f20: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
2f30: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
2f40: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
2f50: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
2f60: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
2f70: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
2f80: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
2f90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2fa0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
2fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fc0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
2fd0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
2fe0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2ff0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3000: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
3010: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
3020: 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20     int nPage;.  
3030: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3040: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
3050: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
3060: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
3070: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3080: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
3090: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
30a0: 65 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50  ecCreate((u32)nP
30b0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
30c0: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
30d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
30e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
30f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3100: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
3110: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
3120: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
3130: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
3140: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
3150: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
3160: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
3170: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
3180: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3190: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
31a0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
31b0: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
31c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
31d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
31e0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
31f0: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
3200: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
3210: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
3220: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
3230: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
3240: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
3250: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
3260: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
3270: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
3280: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
3290: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
32a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
32b0: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
32c0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
32d0: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
32e0: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
32f0: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
3300: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
3310: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
3320: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
3330: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
3340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
3350: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
3360: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3370: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
3380: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
3390: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
33a0: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
33b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
33c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
33d0: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
33e0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
33f0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
3400: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
3410: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
3420: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
3430: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
3440: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
3450: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
3460: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
3470: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
3480: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
3490: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
34a0: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
34b0: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
34c0: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
34d0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
34e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
34f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
3500: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3510: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
3520: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
3530: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
3540: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
3550: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
3560: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
3570: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
3580: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
3590: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
35a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
35b0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
35c0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
35d0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
35e0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
35f0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
3600: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
3610: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
3620: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
3630: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
3640: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
3650: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
3660: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
3670: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
3680: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
3690: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
36a0: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
36b0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
36c0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
36d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36e0: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61  && 0==pCur->apPa
36f0: 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a  ge[0]->intKey){.
3700: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
3710: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
3720: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
3730: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
3740: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
3750: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
3760: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
3770: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
3780: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
3790: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37a0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
37b0: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
37c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37d0: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
37e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
37f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
3800: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
3810: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
3820: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
3830: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
3840: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
3850: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3860: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3870: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
3880: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
3890: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
38a0: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
38b0: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
38c0: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
38d0: 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
38e0: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43  age = -1;.    pC
38f0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
3900: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
3910: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
3920: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3930: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
3940: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
3950: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
3960: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
3970: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
3980: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
3990: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
39a0: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
39b0: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
39c0: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
39d0: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
39e0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
39f0: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
3a00: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
3a10: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
3a20: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
3a30: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
3a40: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
3a50: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
3a60: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
3a70: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3a80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3a90: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3aa0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3ab0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
3ac0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
3ad0: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
3ae0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
3af0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3b00: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
3b10: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
3b20: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
3b30: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
3b40: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
3b50: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
3b60: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
3b70: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
3b80: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
3b90: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
3ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
3bb0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
3be0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
3bf0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
3c00: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
3c10: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
3c20: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
3c30: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
3c40: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
3c50: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3c60: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
3c70: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
3c80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
3c90: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
3ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
3cb0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
3cc0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
3cd0: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
3ce0: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
3cf0: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
3d00: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
3d10: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
3d20: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
3d30: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
3d40: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
3d50: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
3d60: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
3d70: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
3d80: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
3d90: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
3da0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3db0: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
3dc0: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
3dd0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
3de0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
3df0: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
3e00: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
3e10: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
3e20: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
3e30: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
3e40: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
3e50: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
3e60: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
3e70: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
3e80: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
3e90: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
3ea0: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
3eb0: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
3ec0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
3ed0: 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  LID;.  rc = sqli
3ee0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
3ef0: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
3f00: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
3f10: 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20  &pCur->skip);.  
3f20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3f30: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
3f40: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
3f50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
3f60: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
3f70: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
3f80: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
3f90: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
3fa0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
3fb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3fc0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
3fd0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3fe0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
3ff0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
4000: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
4010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
4020: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
4030: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
4040: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
4050: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
4060: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
4070: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
4080: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
4090: 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61  osition it.** wa
40a0: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74  s last placed at
40b0: 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  .  Cursors can m
40c0: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
40d0: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
40e0: 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65  ng.** at is dele
40f0: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
4100: 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er them..**.** T
4110: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4120: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rns an error cod
4130: 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  e if something g
4140: 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a  oes wrong.  The.
4150: 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73  ** integer *pHas
4160: 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
4170: 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  one if the curso
4180: 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20  r has moved and 
4190: 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74  0 if not..*/.int
41a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
41b0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
41c0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
41d0: 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69  *pHasMoved){.  i
41e0: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  nt rc;..  rc = r
41f0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
4200: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
4210: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61  ( rc ){.    *pHa
4220: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  sMoved = 1;.    
4230: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
4240: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
4250: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
4260: 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30  || pCur->skip!=0
4270: 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76   ){.    *pHasMov
4280: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
4290: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
42a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
42b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
42c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
42d0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
42e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
42f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
4300: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
4310: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
4320: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
4330: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
4340: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
4350: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
4360: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
4370: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f   page number..*/
4380: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
4390: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
43a0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
43b0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
43c0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
43d0: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
43e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
43f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4400: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4410: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
4420: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
4430: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
4440: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
4450: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
4460: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
4470: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
4480: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
4490: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
44a0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
44b0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
44c0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
44d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
44e0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
44f0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
4500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
4510: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
4520: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
4530: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
4540: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
4550: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
4560: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
4570: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
4580: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
4590: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
45a0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
45b0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
45c0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
45d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
45e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
45f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
4600: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
4610: 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20  rent){.  DbPage 
4620: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
4630: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
4640: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
4650: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
4660: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
4670: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
4680: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
4690: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
46a0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
46b0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
46c0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
46d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
46e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
46f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4700: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
4710: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
4720: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
4730: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
4740: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
4750: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
4760: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
4770: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
4780: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
4790: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
47a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
47b0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
47c0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
47d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
47e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
47f0: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
4800: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
4810: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
4820: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
4830: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
4840: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
4850: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4860: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
4870: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
4880: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
4890: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
48a0: 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  key);.  pPtrmap 
48b0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
48c0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
48d0: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
48e0: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
48f0: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
4900: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
4910: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
4920: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
4930: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
4940: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
4950: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
4960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4970: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
4980: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
4990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
49a0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
49b0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
49c0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
49d0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
49e0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
49f0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67   }..  sqlite3Pag
4a00: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
4a10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4a20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
4a30: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
4a40: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
4a50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
4a60: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
4a70: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
4a80: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
4a90: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
4aa0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
4ab0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
4ac0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
4ad0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
4ae0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
4af0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
4b00: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4b10: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
4b20: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
4b30: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
4b40: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b50: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
4b60: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
4b70: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
4b80: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
4b90: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
4ba0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
4bb0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
4bc0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
4bd0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
4be0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
4bf0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
4c00: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
4c10: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
4c20: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
4c30: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
4c40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4c50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4c60: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
4c70: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
4c80: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
4c90: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
4ca0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
4cb0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
4cc0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
4cd0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
4ce0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4cf0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
4d00: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
4d10: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
4d20: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
4d30: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
4d40: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
4d50: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  y);.  assert( pE
4d60: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
4d70: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
4d80: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
4d90: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
4da0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
4db0: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
4dc0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
4dd0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
4de0: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
4df0: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
4e00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
4e10: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
4e20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
4e30: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
4e40: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
4e50: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
4e60: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
4e70: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
4e80: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
4e90: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
4ea0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
4eb0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
4ec0: 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  l(y,z) SQLITE_OK
4ed0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
4ee0: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
4ef0: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
4f00: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
4f10: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
4f20: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
4f30: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
4f40: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
4f50: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
4f60: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
4f70: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
4f80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
4f90: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
4fa0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
4fb0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
4fc0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
4fd0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
4fe0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
4ff0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
5000: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
5010: 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c  ->aData[(P)->cel
5020: 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29  lOffset+2*(I)]))
5030: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  )../*.** This a 
5040: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
5050: 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c  sion of findCell
5060: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
5070: 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20  r.** pages that 
5080: 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  do contain overf
5090: 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20  low cells.  See 
50a0: 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63  insert.*/.static
50b0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
50c0: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
50d0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
50e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
50f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5100: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
5110: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5120: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
5130: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
5140: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
5150: 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66  .    struct _Ovf
5160: 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20  lCell *pOvfl;.  
5170: 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65    pOvfl = &pPage
5180: 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  ->aOvfl[i];.    
5190: 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a  k = pOvfl->idx;.
51a0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
51b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
51c0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
51d0: 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e    return pOvfl->
51e0: 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pCell;.      }. 
51f0: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
5200: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5210: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
5220: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
5230: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
5240: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
5250: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
5260: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
5270: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
5280: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
5290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73  his function.  s
52a0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
52b0: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
52c0: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
52d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
52e0: 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33  ment and sqlite3
52f0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
5300: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
5310: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
5320: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
5330: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
5340: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
5350: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
5360: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
5370: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
5380: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
5390: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
53a0: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
53b0: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
53c0: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
53d0: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64   faster..*/.void
53e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
53f0: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
5400: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
5410: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
5420: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
5430: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5450: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
5460: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
5470: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
5480: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
5490: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
54a0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
54d0: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
54e0: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
54f0: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
5500: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5510: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
5520: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
5530: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5540: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
5550: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
5560: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
5570: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
5580: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
5590: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
55a0: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
55b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
55c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
55d0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
55e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
55f0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
5600: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
5610: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
5620: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
5630: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
5640: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5650: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
5660: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
5670: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
5680: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
5690: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
56a0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
56b0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
56c0: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
56d0: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
56e0: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
56f0: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
5700: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
5710: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
5720: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
5730: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
5740: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
5750: 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  n;.  if( likely(
5760: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
5770: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
5780: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
5790: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
57a0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
57b0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
57c0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
57d0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
57e0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
57f0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
5800: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
5810: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
5820: 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  ze of cell conte
5830: 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  nt in bytes */. 
5840: 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c     nSize = nPayl
5850: 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  oad + n;.    pIn
5860: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
5870: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
5880: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
5890: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e   = 0;.    if( (n
58a0: 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b  Size & ~3)==0 ){
58b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
58c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
58d0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
58e0: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
58f0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
5900: 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  u16)nSize;.  }el
5910: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
5920: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
5930: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
5940: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
5950: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
5960: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
5970: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
5980: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
5990: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
59a0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
59b0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
59c0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
59d0: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
59e0: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
59f0: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
5a00: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
5a10: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
5a20: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
5a30: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
5a40: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
5a50: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
5a60: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
5a70: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
5a80: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
5a90: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
5aa0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
5ab0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
5ac0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
5ad0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
5ae0: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
5af0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
5b00: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
5b10: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5b20: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5b30: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
5b40: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
5b50: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5b60: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5b70: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
5b80: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
5b90: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
5ba0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
5bb0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
5bc0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
5bd0: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
5be0: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
5bf0: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
5c00: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
5c10: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
5c20: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
5c30: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
5c40: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
5c50: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
5c60: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
5c70: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
5c80: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
5c90: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
5ca0: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
5cb0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
5cc0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
5cd0: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
5ce0: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
5cf0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
5d00: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
5d10: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
5d20: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
5d30: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
5d40: 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  \.  sqlite3Btree
5d50: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50  ParseCellPtr((pP
5d60: 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28  age), findCell((
5d70: 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29  pPage), (iCell))
5d80: 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20  , (pInfo)).void 
5d90: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
5da0: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
5db0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
5dc0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
5dd0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
5de0: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
5df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5e00: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
5e10: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
5e20: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
5e30: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
5e40: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
5e50: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72  ture */.){.  par
5e60: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
5e70: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ell, pInfo);.}..
5e80: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
5e90: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
5ea0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
5eb0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
5ec0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
5ed0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
5ee0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
5ef0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
5f00: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
5f10: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
5f20: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
5f30: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
5f40: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
5f50: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
5f60: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
5f70: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
5f80: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
5f90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
5fa0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
5fb0: 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b  *pIter = &pCell[
5fc0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
5fd0: 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a  ize];.  u32 nSiz
5fe0: 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
5ff0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
6000: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
6010: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
6020: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
6030: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
6040: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
6050: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
6060: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
6070: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
6080: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
6090: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
60a0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
60b0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
60c0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
60d0: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
60e0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
60f0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
6100: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
6110: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
6120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
6130: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
6140: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
6150: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
6160: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
6170: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
6180: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
6190: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
61a0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
61b0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
61c0: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
61d0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
61e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
61f0: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
6200: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
6210: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
6220: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
6230: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
6240: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
6250: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
6260: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
6270: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
6280: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
6290: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
62a0: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
62b0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
62c0: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
62d0: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
62e0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
62f0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
6300: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
6310: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
6320: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
6330: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
6340: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
6350: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
6360: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
6370: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
6380: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
6390: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
63a0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
63b0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
63c0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
63d0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
63e0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
63f0: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
6400: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 70 49 74  .  nSize += (pIt
6410: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20  er - pCell);..  
6420: 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  /* The minimum s
6430: 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20  ize of any cell 
6440: 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  is 4 bytes. */. 
6450: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a   if( nSize<4 ){.
6460: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20      nSize = 4;. 
6470: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53   }..  assert( nS
6480: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
6490: 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e  Size );.  return
64a0: 20 6e 53 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65   nSize;.}.#ifnde
64b0: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
64c0: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
64d0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
64e0: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
64f0: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  n cellSizePtr(pP
6500: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
6510: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
6520: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6540: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
6550: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
6560: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
6570: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
6580: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
6590: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
65a0: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
65b0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
65c0: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
65d0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
65e0: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
65f0: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
6600: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
6610: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
6620: 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72  fo info;.  asser
6630: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
6640: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
6650: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
6660: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
6670: 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
6680: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
6690: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
66a0: 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
66b0: 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e 66 6f  d );.  if( (info
66c0: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
66d0: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
66e0: 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
66f0: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
6700: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
6710: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
6720: 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  w]);.    return 
6730: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
6740: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
6750: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
6760: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
6770: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6780: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
6790: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
67a0: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
67b0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
67c0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
67d0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
67e0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
67f0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6800: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
6810: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
6820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6830: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
6840: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6850: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
6860: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
6870: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6880: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
6890: 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c  utex) );.  pCell
68a0: 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
68b0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
68c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d  );.  return ptrm
68d0: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
68e0: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65  ge, pCell);.}.#e
68f0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
6900: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
6910: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
6920: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
6930: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
6940: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
6950: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
6960: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
6970: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
6980: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
6990: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
69a0: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
69b0: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
69c0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
69d0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
69e0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
69f0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
6a00: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a20: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
6a30: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
6a60: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
6a70: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
6a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
6a90: 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62 79  fset of first by
6aa0: 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f  te after cell po
6ab0: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
6ac0: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6ae0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
6af0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
6b00: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
6b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
6b20: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
6b30: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
6b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6b50: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
6b60: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
6b70: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
6b80: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
6b90: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
6ba0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
6bb0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
6bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6bd0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
6be0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6bf0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
6c00: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
6c10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6c20: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
6c30: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
6c40: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
6c50: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
6c60: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
6c70: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
6c80: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
6c90: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
6ca0: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
6cb0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
6cc0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
6cd0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
6ce0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
6cf0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
6d00: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
6d10: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
6d20: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
6d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6d40: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
6d50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
6d60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6d70: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6d80: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
6d90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
6da0: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
6db0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
6dc0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
6dd0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
6de0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
6df0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
6e00: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
6e10: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
6e20: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
6e30: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
6e40: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
6e50: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
6e60: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
6e70: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
6e80: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6e90: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
6ea0: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
6eb0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
6ec0: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
6ed0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
6ee0: 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Size;.  for(i=0;
6ef0: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
6f00: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
6f10: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
6f20: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
6f30: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
6f40: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
6f50: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
6f60: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
6f70: 20 20 69 66 28 20 70 63 3e 3d 75 73 61 62 6c 65    if( pc>=usable
6f80: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
6f90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6fa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
6fb0: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
6fc0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
6fd0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
6fe0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
6ff0: 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c 4f 66 66  if( cbrk<cellOff
7000: 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c 7c 20 70  set+2*nCell || p
7010: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
7020: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
7030: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7040: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
7050: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
7060: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
7070: 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a 20 20 20  & cbrk>=0 );.   
7080: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
7090: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
70a0: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
70b0: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
70c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
70d0: 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74  cbrk>=cellOffset
70e0: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
70f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7100: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
7110: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
7120: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
7130: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
7140: 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65  = 0;.  addr = ce
7150: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
7160: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
7170: 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62 72 6b 2d  [addr], 0, cbrk-
7180: 61 64 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  addr);.  assert(
7190: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
71a0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
71b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
71c0: 28 20 63 62 72 6b 2d 61 64 64 72 21 3d 70 50 61  ( cbrk-addr!=pPa
71d0: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
71e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
71f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
7200: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7210: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
7220: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
7230: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
7240: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
7250: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
7260: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
7270: 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
7280: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
7290: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66  Page->aData[] of
72a0: 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 62   the .** first b
72b0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
72c0: 20 73 70 61 63 65 2e 20 0a 2a 2a 0a 2a 2a 20 54   space. .**.** T
72d0: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
72e0: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 73 70  tees that the sp
72f0: 61 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  ace between the 
7300: 65 6e 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  end of the cell-
7310: 6f 66 66 73 65 74 20 0a 2a 2a 20 61 72 72 61 79  offset .** array
7320: 20 61 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f   and the start o
7330: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
7340: 6e 74 20 61 72 65 61 20 69 73 20 61 74 20 6c 65  nt area is at le
7350: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 0a  ast nByte bytes.
7360: 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 53 6f 20 74  ** in size. So t
7370: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
7380: 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  never fail..**.*
7390: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
73a0: 6c 72 65 61 64 79 20 36 30 20 6f 72 20 6d 6f 72  lready 60 or mor
73b0: 65 20 62 79 74 65 73 20 6f 66 20 66 72 61 67 6d  e bytes of fragm
73c0: 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65 20  ents within the 
73d0: 70 61 67 65 2c 0a 2a 2a 20 74 68 65 20 70 61 67  page,.** the pag
73e0: 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65  e is defragmente
73f0: 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
7400: 6e 67 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  ng. If this were
7410: 20 6e 6f 74 20 64 6f 6e 65 20 74 68 65 72 65 0a   not done there.
7420: 2a 2a 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  ** is a chance t
7430: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
7440: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
7450: 65 73 20 63 6f 75 6c 64 20 65 76 65 6e 74 75 61  es could eventua
7460: 6c 6c 79 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  lly .** overflow
7470: 20 74 68 65 20 73 69 6e 67 6c 65 2d 62 79 74 65   the single-byte
7480: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
7490: 67 65 2d 68 65 61 64 65 72 20 69 6e 20 77 68 69  ge-header in whi
74a0: 63 68 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  ch this value.**
74b0: 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 73   is stored..*/.s
74c0: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
74d0: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
74e0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
74f0: 65 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  e){.  const int 
7500: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
7510: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
7520: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
7530: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
7540: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
7550: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7560: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
7570: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
7580: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
7590: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
75c0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
75d0: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
75e0: 20 74 6f 70 3b 0a 20 20 0a 20 20 61 73 73 65 72   top;.  .  asser
75f0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
7600: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
7610: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
7620: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
7630: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
7640: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7650: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
7660: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
7670: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
7680: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
7690: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
76a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
76b0: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
76c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
76d0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
76e0: 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
76f0: 20 74 68 65 20 73 70 61 63 65 20 62 65 74 77 65   the space betwe
7700: 65 6e 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73  en the cell-offs
7710: 65 74 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  et array and the
7720: 20 0a 20 20 2a 2a 20 63 65 6c 6c 2d 63 6f 6e 74   .  ** cell-cont
7730: 65 6e 74 20 61 72 65 61 20 69 73 20 67 72 65 61  ent area is grea
7740: 74 65 72 20 74 68 61 6e 20 6e 42 79 74 65 20 62  ter than nByte b
7750: 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ytes..  */.  ass
7760: 65 72 74 28 20 6e 42 79 74 65 20 3c 3d 20 28 0a  ert( nByte <= (.
7770: 20 20 20 20 20 20 67 65 74 32 62 79 74 65 28 26        get2byte(&
7780: 64 61 74 61 5b 68 64 72 2b 35 5d 29 2d 28 68 64  data[hdr+5])-(hd
7790: 72 2b 38 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66  r+8+(pPage->leaf
77a0: 3f 30 3a 34 29 2b 32 2a 67 65 74 32 62 79 74 65  ?0:4)+2*get2byte
77b0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 29 0a  (&data[hdr+3])).
77c0: 20 20 29 29 3b 0a 0a 20 20 70 50 61 67 65 2d 3e    ));..  pPage->
77d0: 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 6e 42  nFree -= (u16)nB
77e0: 79 74 65 3b 0a 20 20 6e 46 72 61 67 20 3d 20 64  yte;.  nFrag = d
77f0: 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66  ata[hdr+7];.  if
7800: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
7810: 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67     defragmentPag
7820: 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
7830: 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
7840: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
7850: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
7860: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
7870: 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20   to satisfy .   
7880: 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e   ** the request.
7890: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
78a0: 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65  is made from the
78b0: 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74   first free slot
78c0: 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
78d0: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72  list that is lar
78e0: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63  ge enough to acc
78f0: 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20  omadate it..    
7900: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  */.    int pc, a
7910: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
7920: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
7930: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
7940: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
7950: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
7960: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
7970: 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f  ta[pc+2]);     /
7980: 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73  * Size of free s
7990: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
79a0: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
79b0: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
79c0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
79d0: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
79e0: 0a 09 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
79f0: 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20  e slot from the 
7a00: 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74  free-list. Updat
7a10: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  e the number of.
7a20: 09 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64  .  ** fragmented
7a30: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
7a40: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
7a50: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
7a60: 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70  a[addr], &data[p
7a70: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
7a80: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
7a90: 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b  (u8)(nFrag + x);
7aa0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7ab0: 09 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72  .  /* The slot r
7ac0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
7ad0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
7ae0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
7af0: 75 6e 74 0a 09 20 20 2a 2a 20 66 6f 72 20 74 68  unt..  ** for th
7b00: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
7b10: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
7b20: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
7b30: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
7b40: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
7b50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
7b60: 65 74 75 72 6e 20 70 63 20 2b 20 78 3b 0a 20 20  eturn pc + x;.  
7b70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7b80: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
7b90: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
7ba0: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
7bb0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
7bc0: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
7bd0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
7be0: 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  rea..  */.  top 
7bf0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
7c00: 5b 68 64 72 2b 35 5d 29 20 2d 20 6e 42 79 74 65  [hdr+5]) - nByte
7c10: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
7c20: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
7c30: 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d  .  return top;.}
7c40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
7c50: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
7c60: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
7c70: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
7c80: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
7c90: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
7ca0: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
7cb0: 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20  aDisk[start].** 
7cc0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
7cd0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69  the block is "si
7ce0: 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ze" bytes..**.**
7cf0: 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66   Most of the eff
7d00: 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f  ort here is invo
7d10: 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e  lved in coalesin
7d20: 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72  g adjacent.** fr
7d30: 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61  ee blocks into a
7d40: 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65   single big free
7d50: 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   block..*/.stati
7d60: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
7d70: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
7d80: 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73  int start, int s
7d90: 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ize){.  int addr
7da0: 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20  , pbegin, hdr;. 
7db0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7dc0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
7dd0: 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ata;..  assert( 
7de0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
7df0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7e00: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
7e10: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
7e20: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
7e30: 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  start>=pPage->hd
7e40: 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65  rOffset+6+(pPage
7e50: 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20  ->leaf?0:4) );. 
7e60: 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20   assert( (start 
7e70: 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e  + size)<=pPage->
7e80: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7ea0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7eb0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
7ec0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
7ed0: 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20  size>=0 );   /* 
7ee0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
7ef0: 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65  e is 4 */..#ifde
7f00: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
7f10: 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72  DELETE.  /* Over
7f20: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
7f30: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
7f40: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45  eros when the SE
7f50: 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a  CURE_DELETE .  *
7f60: 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
7f70: 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
7f80: 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ime */.  memset(
7f90: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c  &data[start], 0,
7fa0: 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a   size);.#endif..
7fb0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
7fc0: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
7fd0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
7fe0: 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  freeblocks */.  
7ff0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8000: 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d  Offset;.  addr =
8010: 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c   hdr + 1;.  whil
8020: 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74  e( (pbegin = get
8030: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
8040: 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65  ]))<start && pbe
8050: 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  gin>0 ){.    ass
8060: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
8070: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8080: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 69 66 28  ize-4 );.    if(
8090: 20 70 62 65 67 69 6e 3c 3d 61 64 64 72 20 29 20   pbegin<=addr ) 
80a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
80b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
80c0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  PT;.    }.    ad
80d0: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d  dr = pbegin;.  }
80e0: 0a 20 20 69 66 20 28 20 70 62 65 67 69 6e 3e 70  .  if ( pbegin>p
80f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8100: 65 53 69 7a 65 2d 34 20 29 20 7b 0a 20 20 20 20  eSize-4 ) {.    
8110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8120: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
8130: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
8140: 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d  >addr || pbegin=
8150: 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  =0 );.  put2byte
8160: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74  (&data[addr], st
8170: 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65  art);.  put2byte
8180: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70  (&data[start], p
8190: 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79  begin);.  put2by
81a0: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32  te(&data[start+2
81b0: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67  ], size);.  pPag
81c0: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 28 75 31 36  e->nFree += (u16
81d0: 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61  )size;..  /* Coa
81e0: 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66  lesce adjacent f
81f0: 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ree blocks */.  
8200: 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64  addr = pPage->hd
8210: 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77  rOffset + 1;.  w
8220: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
8230: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
8240: 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20  ddr]))>0 ){.    
8250: 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65  int pnext, psize
8260: 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  , x;.    assert(
8270: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a   pbegin>addr );.
8280: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
8290: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
82a0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
82b0: 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32      pnext = get2
82c0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
82d0: 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d  n]);.    psize =
82e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
82f0: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
8300: 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69  if( pbegin + psi
8310: 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20  ze + 3 >= pnext 
8320: 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20  && pnext>0 ){.  
8330: 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70      int frag = p
8340: 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70  next - (pbegin+p
8350: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  size);.      if(
8360: 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72   (frag<0) || (fr
8370: 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 70 50 61  ag>(int)data[pPa
8380: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
8390: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
83a0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
83b0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
83c0: 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50 61 67  .      data[pPag
83d0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20  e->hdrOffset+7] 
83e0: 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20  -= (u8)frag;.   
83f0: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
8400: 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20  &data[pnext]);. 
8410: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
8420: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b  ata[pbegin], x);
8430: 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74  .      x = pnext
8440: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
8450: 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62  a[pnext+2]) - pb
8460: 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32  egin;.      put2
8470: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
8480: 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65  n+2], x);.    }e
8490: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20  lse{.      addr 
84a0: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a  = pbegin;.    }.
84b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
84c0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
84d0: 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  ea begins with a
84e0: 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f   freeblock, remo
84f0: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ve it. */.  if( 
8500: 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74  data[hdr+1]==dat
8510: 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61  a[hdr+5] && data
8520: 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+2]==data[hd
8530: 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  r+6] ){.    int 
8540: 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20  top;.    pbegin 
8550: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8560: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65  [hdr+1]);.    me
8570: 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31  mcpy(&data[hdr+1
8580: 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  ], &data[pbegin]
8590: 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20  , 2);.    top = 
85a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
85b0: 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74  dr+5]) + get2byt
85c0: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
85d0: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
85e0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
85f0: 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  op);.  }.  asser
8600: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
8610: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
8620: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
8630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
8650: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
8660: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
8670: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
8680: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
8690: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
86a0: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
86b0: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
86c0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
86d0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
86e0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
86f0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
8700: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
8710: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
8720: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
8730: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
8740: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
8750: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
8760: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
8770: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
8780: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
8790: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
87a0: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
87b0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
87c0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
87d0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
87e0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
87f0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
8800: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
8810: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
8820: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
8830: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
8840: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
8850: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
8860: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
8870: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8880: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8890: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
88a0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
88b0: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
88c0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
88d0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
88e0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
88f0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
8900: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
8910: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
8920: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
8930: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
8940: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
8950: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
8960: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61  TKEY) ){.    pPa
8970: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
8980: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
8990: 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  ta = pPage->leaf
89a0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
89b0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
89c0: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
89d0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
89e0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
89f0: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
8a00: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
8a10: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
8a20: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
8a30: 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20  ->hasData = 0;. 
8a40: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
8a50: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
8a60: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
8a70: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
8a80: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
8a90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8aa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8ab0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
8ac0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8ad0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
8ae0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
8af0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
8b00: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
8b10: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
8b20: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
8b30: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
8b40: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
8b50: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
8b60: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
8b70: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
8b80: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
8b90: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
8ba0: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
8bb0: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
8bc0: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
8bd0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
8be0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
8bf0: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
8c00: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
8c10: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
8c20: 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ption..*/.int sq
8c30: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
8c40: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
8c50: 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
8c60: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
8c70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8c80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8c90: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8ca0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8cb0: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
8cc0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
8cd0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
8ce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8cf0: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
8d00: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
8d10: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8d20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8d30: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
8d40: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
8d50: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
8d60: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
8d70: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
8d80: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
8d90: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
8da0: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
8db0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
8dc0: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
8dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8de0: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
8df0: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
8e00: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
8e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
8e20: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
8e30: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
8e40: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
8e50: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
8e60: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
8e70: 20 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a     u16 usableSiz
8e80: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
8e90: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
8ea0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
8eb0: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
8ec0: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
8ed0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
8ee0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
8ef0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
8f00: 20 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20 20   u16 nFree;     
8f10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8f20: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
8f30: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
8f40: 20 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20 20   u16 top;       
8f50: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
8f60: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
8f70: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20  ntent area */.. 
8f80: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
8f90: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
8fa0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
8fb0: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
8fc0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  ge->aData;.    i
8fd0: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
8fe0: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
8ff0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
9000: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9010: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
9020: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
9030: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
9040: 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61  32768 );.    pPa
9050: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
9060: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
9070: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
9080: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
9090: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
90a0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
90b0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
90c0: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
90d0: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
90e0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
90f0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
9100: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9110: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
9120: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9130: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
9140: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
9150: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
9160: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
9170: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
9180: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
9190: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
91a0: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
91b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
91c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
91d0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
91e0: 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
91f0: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
9200: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
9210: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9220: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
9230: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
9240: 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74  op - (cellOffset
9250: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
9260: 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  l);.    while( p
9270: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36  c>0 ){.      u16
9280: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
9290: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
92a0: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
92b0: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20    /* Free block 
92c0: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
92d0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
92e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
92f0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
9300: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
9310: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
9320: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
9330: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
9340: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
9350: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
9360: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
9370: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
9380: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
9390: 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  ccending order *
93a0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
93b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
93c0: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
93d0: 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69       nFree += si
93e0: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
93f0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
9400: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
9410: 31 36 29 6e 46 72 65 65 3b 0a 20 20 20 20 69 66  16)nFree;.    if
9420: 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53  ( nFree>=usableS
9430: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
9440: 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f  Free space canno
9450: 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70  t exceed total p
9460: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
9470: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9480: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
9490: 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f 2a     }..#if 0.  /*
94a0: 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c 6c 20   Check that all 
94b0: 74 68 65 20 6f 66 66 73 65 74 73 20 69 6e 20 74  the offsets in t
94c0: 68 65 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61  he cell offset a
94d0: 72 72 61 79 20 61 72 65 20 77 69 74 68 69 6e 20  rray are within 
94e0: 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20 20  range. .  ** .  
94f0: 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74 68 69 73  ** Omitting this
9500: 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63 68 65   consistency che
9510: 63 6b 20 61 6e 64 20 75 73 69 6e 67 20 74 68 65  ck and using the
9520: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
9530: 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70 72   mask.  ** to pr
9540: 65 76 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69 6e  event overrunnin
9550: 67 20 74 68 65 20 70 61 67 65 20 62 75 66 66 65  g the page buffe
9560: 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29 20  r in findCell() 
9570: 72 65 73 75 6c 74 73 20 69 6e 20 61 0a 20 20 2a  results in a.  *
9580: 2a 20 32 2e 35 25 20 70 65 72 66 6f 72 6d 61 6e  * 2.5% performan
9590: 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ce gain..  */.  
95a0: 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66 66 3b 20  {.    u8 *pOff; 
95b0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
95c0: 6f 72 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  or used to check
95d0: 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65 74   all cell offset
95e0: 73 20 61 72 65 20 69 6e 20 72 61 6e 67 65 20 2a  s are in range *
95f0: 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 20  /.    u8 *pEnd; 
9600: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9610: 72 20 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c 6c  r to end of cell
9620: 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 2a 2f   offset array */
9630: 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b 20 20 20  .    u8 mask;   
9640: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
9650: 20 62 69 74 73 20 74 68 61 74 20 6d 75 73 74 20   bits that must 
9660: 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20 6f  be zero in MSB o
9670: 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 2a  f cell offsets *
9680: 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28 28  /.    mask = ~((
9690: 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
96a0: 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20 20  ze>>8))-1);.    
96b0: 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c  pEnd = &data[cel
96c0: 6c 4f 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d  lOffset + pPage-
96d0: 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66  >nCell*2];.    f
96e0: 6f 72 28 70 4f 66 66 3d 26 64 61 74 61 5b 63 65  or(pOff=&data[ce
96f0: 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66 21  llOffset]; pOff!
9700: 3d 70 45 6e 64 20 26 26 20 21 28 28 2a 70 4f 66  =pEnd && !((*pOf
9710: 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b 3d  f)&mask); pOff+=
9720: 32 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 66 66  2);.    if( pOff
9730: 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  !=pEnd ){.      
9740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9750: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9760: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
9770: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
9780: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
9790: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
97a0: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
97b0: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
97c0: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
97d0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
97e0: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
97f0: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
9800: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
9810: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9820: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
9830: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
9840: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
9850: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
9860: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
9870: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
9880: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
9890: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
98a0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
98b0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
98c0: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
98d0: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
98e0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
98f0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
9900: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
9910: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
9920: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9930: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
9940: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
9950: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9960: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9970: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9980: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
9990: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
99a0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
99b0: 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74 28  ) );.  /*memset(
99c0: 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
99d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
99e0: 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61 5b   hdr);*/.  data[
99f0: 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
9a00: 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
9a10: 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67  r + 8 + 4*((flag
9a20: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
9a30: 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  1:0);.  memset(&
9a40: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
9a50: 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37  4);.  data[hdr+7
9a60: 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74  ] = 0;.  put2byt
9a70: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
9a80: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
9a90: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
9aa0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
9ab0: 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65  ze - first;.  de
9ac0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
9ad0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
9ae0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64  ->hdrOffset = hd
9af0: 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  r;.  pPage->cell
9b00: 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
9b10: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
9b20: 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
9b30: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
9b40: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
9b50: 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a  eSize<=32768 );.
9b60: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
9b70: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
9b80: 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e  e - 1;.  pPage->
9b90: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
9ba0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
9bb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
9bc0: 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
9bd0: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
9be0: 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
9bf0: 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
9c00: 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
9c10: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
9c20: 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
9c30: 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
9c40: 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
9c50: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
9c60: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
9c70: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
9c80: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
9c90: 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ra(pDbPage);.  p
9ca0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
9cb0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
9cc0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
9cd0: 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
9ce0: 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d  DbPage;.  pPage-
9cf0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50  >pBt = pBt;.  pP
9d00: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  age->pgno = pgno
9d10: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
9d20: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67  fset = pPage->pg
9d30: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
9d40: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
9d50: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
9d60: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
9d70: 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
9d80: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
9d90: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
9da0: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
9db0: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  if needed..**.**
9dc0: 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   If the noConten
9dd0: 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  t flag is set, i
9de0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
9df0: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
9e00: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
9e10: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
9e20: 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
9e30: 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
9e40: 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
9e50: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
9e60: 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
9e70: 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
9e80: 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
9e90: 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
9ea0: 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
9eb0: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
9ec0: 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
9ed0: 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
9ee0: 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
9ef0: 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
9f00: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
9f10: 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
9f20: 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
9f30: 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
9f40: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
9f50: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
9f60: 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
9f70: 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
9f80: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
9f90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
9fa0: 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
9fb0: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
9fc0: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
9fd0: 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
9fe0: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
9ff0: 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
a000: 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  t        /* Do n
a010: 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e  ot load page con
a020: 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  tent if true */.
a030: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
a040: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
a050: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a060: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
a070: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
a080: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
a090: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
a0a0: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
a0b0: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e  ge**)&pDbPage, n
a0c0: 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28  oContent);.  if(
a0d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a0e0: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
a0f0: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
a100: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
a110: 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
a120: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a130: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
a140: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
a150: 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
a160: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
a170: 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
a180: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
a190: 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
a1a0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
a1b0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
a1c0: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
a1d0: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
a1e0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
a1f0: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
a200: 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
a210: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
a220: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
a230: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
a240: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a250: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
a260: 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
a270: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
a280: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
a290: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
a2a0: 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
a2b0: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
a2c0: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
a2d0: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
a2e0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
a2f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
a300: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
a310: 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
a320: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
a330: 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
a340: 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
a350: 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
a360: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 61  /.static Pgno pa
a370: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42 74 53  gerPagecount(BtS
a380: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
a390: 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a 20  nt nPage = -1;. 
a3a0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
a3b0: 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  t( pBt->pPage1 )
a3c0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a3d0: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
a3e0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
a3f0: 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ge);.  assert( r
a400: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
a410: 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20 20 72  nPage==-1 );.  r
a420: 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50 61 67  eturn (Pgno)nPag
a430: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  e;.}../*.** Get 
a440: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
a450: 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
a460: 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72  lize it.  This r
a470: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73  outine.** is jus
a480: 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  t a convenience 
a490: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
a4a0: 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f  eparate calls to
a4b0: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
a4c0: 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 73 71  GetPage() and sq
a4d0: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
a4e0: 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
a4f0: 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
a500: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
a510: 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pBt,          /*
a520: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
a530: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
a540: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
a550: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
a560: 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d  ge to get */.  M
a570: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20  emPage **ppPage 
a580: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
a590: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
a5a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
a5b0: 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
a5c0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
a5d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a5e0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
a5f0: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ;.  if( pgno==0 
a600: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a610: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a620: 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  T; .  }..  /* It
a630: 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63 61   is often the ca
a640: 73 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  se that the page
a650: 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72 65   we want is alre
a660: 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20 20  ady in cache..  
a670: 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69 74  ** If so, get it
a680: 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
a690: 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20 68   saves us from h
a6a0: 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20 20  aving to call.  
a6b0: 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  ** pagerPagecoun
a6c0: 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  t() to make sure
a6d0: 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e 20   pgno is within 
a6e0: 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72 65  limits, which re
a6f0: 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20  sults.  ** in a 
a700: 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65 72 66  measureable perf
a710: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
a720: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70  ents..  */.  *pp
a730: 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20 62  Page = pPage = b
a740: 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
a750: 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  Bt, pgno);.  if(
a760: 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a   pPage ){.    /*
a770: 20 50 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   Page is already
a780: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20   in cache */.   
a790: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a7a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
a7b0: 20 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61 63   Page not in cac
a7c0: 68 65 2e 20 20 41 63 71 75 69 72 65 20 69 74 2e  he.  Acquire it.
a7d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
a7e0: 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
a7f0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65  pBt) ){.      re
a800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a810: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
a820: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a830: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
a840: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
a850: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
a860: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
a870: 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61 67 65   pPage = *ppPage
a880: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
a890: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
a8a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
a8b0: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
a8c0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
a8d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a8e0: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
a8f0: 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50 61  Page);.    *ppPa
a900: 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
a910: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a920: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
a930: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
a940: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
a950: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
a960: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
a970: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e 0a  e3BtreeGetPage..
a980: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a990: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
a9a0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
a9b0: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
a9c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
a9d0: 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71  verflow==0 || sq
a9e0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
a9f0: 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 44  fcount(pPage->pD
aa00: 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20 20 20  bPage)>1 );.    
aa10: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
aa20: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
aa30: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
aa40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
aa50: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
aa60: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
aa70: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
aa80: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
aa90: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
aaa0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
aab0: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
aac0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
aad0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
aae0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
aaf0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
ab00: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
ab10: 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
ab20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ab30: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
ab40: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
ab50: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
ab60: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
ab70: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
ab80: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
ab90: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
aba0: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
abb0: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
abc0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
abd0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
abe0: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
abf0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
ac00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ac10: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
ac20: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
ac30: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
ac40: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
ac50: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
ac60: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
ac70: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
ac80: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
ac90: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
aca0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
acb0: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
acc0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
acd0: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
ace0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
acf0: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
ad00: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
ad10: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
ad20: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
ad30: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ad40: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ad50: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
ad60: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
ad70: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
ad80: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
ad90: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
ada0: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
adb0: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
adc0: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
add0: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
ade0: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
adf0: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
ae00: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
ae10: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
ae20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
ae30: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
ae40: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
ae50: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
ae60: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
ae70: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
ae80: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
ae90: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
aea0: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
aeb0: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
aec0: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42       ** sqlite3B
aed0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
aee0: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
aef0: 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
af00: 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
af10: 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
af20: 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
af30: 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
af40: 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
af50: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
af60: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
af70: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
af80: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
af90: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
afa0: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
afb0: 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
afc0: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
afd0: 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
afe0: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
aff0: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
b000: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
b010: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b020: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
b030: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
b040: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
b050: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
b060: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
b070: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
b080: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
b090: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
b0a0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
b0b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
b0c0: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
b0d0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
b0e0: 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61  .** a new databa
b0f0: 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d  se with a random
b100: 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64   name is created
b110: 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79  .  This randomly
b120: 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61   named.** databa
b130: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
b140: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c  deleted when sql
b150: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
b160: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49   is called..** I
b170: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
b180: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
b190: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
b1a0: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
b1b0: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
b1c0: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
b1d0: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
b1e0: 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
b1f0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
b200: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
b210: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
b220: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
b230: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
b240: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
b250: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
b260: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
b270: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
b280: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
b290: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
b2a0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b2b0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
b2c0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
b2d0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b2f0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
b300: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
b310: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
b320: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
b330: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
b340: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
b350: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
b360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b370: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
b380: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
b390: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
b3a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
b3b0: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
b3c0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
b3d0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3f0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
b400: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
b410: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
b420: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
b430: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
b440: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
b450: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
b460: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b480: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
b490: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
b4a0: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
b4d0: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
b4e0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
b4f0: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
b500: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
b510: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
b520: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53  ntent */..  /* S
b530: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
b540: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
b550: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
b560: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
b570: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
b580: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
b590: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
b5a0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
b5b0: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
b5c0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
b5d0: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
b5e0: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
b5f0: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
b600: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
b610: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
b620: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
b630: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
b640: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b650: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
b660: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
b670: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
b680: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
b690: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
b6a0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
b6b0: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
b6c0: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
b6d0: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
b6e0: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
b6f0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
b700: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
b710: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b720: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
b730: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
b740: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
b750: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
b760: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
b770: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
b780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b790: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
b7a0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
b7b0: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
b7c0: 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  b;..#if !defined
b7d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
b7e0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
b7f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b800: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
b810: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
b820: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
b830: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
b840: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
b850: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
b860: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
b870: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
b880: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
b890: 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26  f( isMemdb==0 &&
b8a0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
b8b0: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
b8c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
b8d0: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
b8e0: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
b8f0: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
b900: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
b910: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
b920: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
b930: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
b940: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
b950: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
b960: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
b970: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
b980: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
b990: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
b9a0: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
b9b0: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66  dCache;.      if
b9c0: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
b9d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b9e0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
b9f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ba00: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
ba10: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
ba20: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
ba30: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
ba40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
ba50: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
ba60: 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
ba70: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
ba80: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
ba90: 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
baa0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
bab0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
bac0: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
bad0: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
bae0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
baf0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
bb00: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
bb10: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
bb20: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
bb30: 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
bb40: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
bb50: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
bb60: 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
bb70: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
bb80: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
bb90: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
bba0: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
bbb0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
bbc0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
bbd0: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
bbe0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
bbf0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
bc00: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
bc10: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
bc20: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
bc30: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
bc40: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
bc50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bc60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
bc70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
bc80: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
bc90: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
bca0: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
bcb0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
bcc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
bcd0: 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
bce0: 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
bcf0: 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
bd00: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
bd10: 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
bd20: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
bd30: 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
bd40: 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
bd50: 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
bd60: 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
bd70: 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
bd80: 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
bd90: 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
bda0: 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
bdb0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
bdc0: 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
bdd0: 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
bde0: 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
bdf0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
be00: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
be10: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
be20: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
be30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
be40: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
be50: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
be60: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
be70: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
be80: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
be90: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
bea0: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
beb0: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
bec0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
bed0: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
bee0: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
bef0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
bf00: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
bf10: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
bf20: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
bf30: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
bf40: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
bf50: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
bf60: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
bf70: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
bf80: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
bf90: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
bfa0: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
bfb0: 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
bfc0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
bfd0: 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
bfe0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
bff0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
c000: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c010: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
c020: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
c030: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c040: 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
c050: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
c060: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66     EXTRA_SIZE, f
c090: 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b  lags, vfsFlags);
c0a0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c0b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c0c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
c0d0: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
c0e0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
c0f0: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
c100: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
c110: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c120: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
c130: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
c140: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
c150: 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
c160: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
c170: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
c180: 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
c190: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
c1a0: 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
c1b0: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73   = pBt;.  .    s
c1c0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
c1d0: 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67  initer(pBt->pPag
c1e0: 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  er, pageReinit);
c1f0: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
c200: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
c210: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
c220: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
c230: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
c240: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
c250: 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  er);.    pBt->pa
c260: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
c270: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  e(&zDbHeader[16]
c280: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
c290: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
c2a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
c2b0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
c2c0: 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
c2d0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
c2e0: 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
c2f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
c300: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
c310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
c320: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
c330: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
c340: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e  >pageSize);.#ifn
c350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c360: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
c370: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
c380: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
c390: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
c3a0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
c3b0: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
c3c0: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
c3d0: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
c3e0: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
c3f0: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
c400: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
c410: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
c420: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
c430: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
c440: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
c450: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
c460: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
c470: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
c480: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
c490: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
c4a0: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
c4b0: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
c4c0: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
c4d0: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
c4e0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
c4f0: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
c500: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
c510: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
c520: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
c530: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
c540: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
c550: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
c560: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
c570: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
c580: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
c590: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
c5a0: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
c5b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
c5c0: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
c5d0: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
c5e0: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
c5f0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
c600: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c610: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
c620: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
c630: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
c640: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
c650: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
c660: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
c670: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
c680: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
c690: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
c6a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c6b0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
c6c0: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
c6d0: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
c6e0: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
c6f0: 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
c700: 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
c710: 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
c720: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
c730: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
c740: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
c750: 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
c760: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
c770: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
c780: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
c790: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
c7a0: 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
c7b0: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
c7c0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
c7d0: 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
c7e0: 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
c7f0: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
c800: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c810: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
c820: 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  red;.      pBt->
c830: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
c840: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
c850: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
c860: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
c870: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
c880: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
c890: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
c8a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
c8b0: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
c8c0: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
c8d0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
c8e0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
c8f0: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
c900: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
c910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
c920: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c930: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
c940: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
c950: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
c960: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
c970: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c980: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
c990: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
c9a0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
c9b0: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
c9c0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
c9d0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
c9e0: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
c9f0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
ca00: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
ca10: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
ca20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
ca30: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
ca40: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
ca50: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
ca60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ca70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
ca80: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ca90: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
caa0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
cab0: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
cac0: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
cad0: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
cae0: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
caf0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
cb00: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
cb10: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
cb20: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
cb30: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
cb40: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
cb50: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
cb60: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
cb70: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
cb80: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
cb90: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
cba0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
cbb0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
cbc0: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
cbd0: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
cbe0: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
cbf0: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
cc00: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
cc10: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
cc20: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
cc30: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
cc40: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
cc50: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
cc60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
cc70: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
cc80: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
cc90: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
cca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
ccb0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
ccc0: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
ccd0: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
cce0: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
ccf0: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
cd00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
cd10: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
cd20: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
cd30: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
cd40: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
cd50: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
cd60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
cd70: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
cd80: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
cd90: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
cda0: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
cdb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
cdc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
cdd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
cde0: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
cdf0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
ce00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ce10: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
ce20: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
ce30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
ce40: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
ce50: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
ce60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ce70: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
ce80: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
ce90: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  pBtree = 0;.  }.
cea0: 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
ceb0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
cec0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ced0: 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
cee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
cef0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
cf00: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
cf10: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
cf20: 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
cf30: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
cf40: 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
cf50: 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
cf60: 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
cf70: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
cf80: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
cf90: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
cfa0: 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
cfb0: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
cfc0: 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
cfd0: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
cfe0: 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
cff0: 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
d000: 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
d010: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
d020: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
d030: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d040: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
d050: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
d060: 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72  Master;.  BtShar
d070: 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
d080: 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
d090: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d0a0: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
d0b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d0c0: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
d0d0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
d0e0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
d0f0: 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74  MASTER);.  sqlit
d100: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
d110: 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
d120: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
d130: 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
d140: 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
d150: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
d160: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
d170: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
d180: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
d190: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
d1a0: 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
d1b0: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
d1c0: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
d1d0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
d1e0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
d1f0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
d200: 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
d210: 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
d220: 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
d230: 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
d240: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
d250: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
d260: 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
d270: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
d280: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
d290: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
d2a0: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
d2b0: 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
d2c0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
d2d0: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
d2e0: 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
d2f0: 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
d300: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
d310: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
d320: 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
d330: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
d340: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
d350: 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
d360: 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
d370: 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
d380: 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
d390: 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
d3a0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
d3b0: 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
d3c0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
d3d0: 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
d3e0: 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
d3f0: 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
d400: 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
d410: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
d420: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
d430: 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
d440: 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
d450: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
d460: 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
d470: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
d480: 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
d490: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
d4a0: 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
d4b0: 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
d4c0: 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
d4d0: 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
d4e0: 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
d4f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
d500: 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
d510: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
d520: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
d530: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
d540: 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
d550: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
d560: 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
d570: 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
d580: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d590: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
d5a0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
d5b0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
d5c0: 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
d5d0: 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
d5e0: 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
d5f0: 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
d600: 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
d610: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
d620: 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
d630: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d640: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
d650: 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
d660: 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
d670: 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
d680: 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
d690: 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
d6a0: 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
d6b0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
d6c0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
d6d0: 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
d6e0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
d6f0: 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
d700: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
d710: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  eeRollback(p);. 
d720: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
d730: 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
d740: 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
d750: 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
d760: 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
d770: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
d780: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
d790: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
d7a0: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
d7b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
d7c0: 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
d7d0: 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
d7e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
d7f0: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
d800: 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
d810: 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
d820: 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
d830: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
d840: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
d850: 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
d860: 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
d870: 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
d880: 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
d890: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
d8a0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
d8b0: 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
d8c0: 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
d8d0: 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
d8e0: 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
d8f0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
d900: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
d910: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
d920: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
d930: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  r);.    if( pBt-
d940: 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
d950: 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
d960: 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
d970: 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
d980: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
d990: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
d9a0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
d9b0: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
d9c0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
d9d0: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
d9e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d9f0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
da00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
da10: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
da20: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
da30: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
da40: 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
da50: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
da60: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
da70: 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
da80: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
da90: 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
daa0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
dab0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
dad0: 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
dae0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
daf0: 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  es allowed in th
db00: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
db10: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
db20: 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73  r of cache pages
db30: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61   is set to the a
db40: 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65  bsolute.** value
db50: 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20   of mxPage.  If 
db60: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
db70: 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69  ve, the pager wi
db80: 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73  ll.** operate as
db90: 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69  ynchronously - i
dba0: 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20  t will not stop 
dbb0: 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a  to do fsync()s.*
dbc0: 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61  * to insure data
dbd0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
dbe0: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
dbf0: 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e  before.** contin
dc00: 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69  uing.  Transacti
dc10: 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ons still work i
dc20: 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
dc30: 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65   off,.** and the
dc40: 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
dc50: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66   be corrupted if
dc60: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a   this program.**
dc70: 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69   crashes.  But i
dc80: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
dc90: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
dca0: 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  r there is.** an
dcb0: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61   abrupt power fa
dcc0: 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68  ilure when synch
dcd0: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74  ronous is off, t
dce0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
dcf0: 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20  ould be left in 
dd00: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
dd10: 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c  and unrecoverabl
dd20: 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63  e state..** Sync
dd30: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79  hronous is on by
dd40: 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61   default so data
dd50: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
dd60: 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c  is not.** normal
dd70: 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69  ly a worry..*/.i
dd80: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
dd90: 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
dda0: 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
ddb0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
ddc0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
ddd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
dde0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
ddf0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
de00: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
de10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
de20: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
de30: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
de40: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
de50: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
de60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
de70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
de80: 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
de90: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
dea0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
deb0: 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
dec0: 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
ded0: 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
dee0: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
def0: 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
df00: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
df10: 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
df20: 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
df30: 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
df40: 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
df50: 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
df60: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
df70: 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
df80: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
df90: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
dfa0: 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
dfb0: 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
dfc0: 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
dfd0: 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
dfe0: 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
dff0: 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
e000: 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
e010: 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
e020: 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
e030: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e040: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
e050: 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
e060: 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
e070: 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  l(Btree *p, int 
e080: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53  level, int fullS
e090: 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ync){.  BtShared
e0a0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
e0b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e0c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
e0d0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
e0e0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
e0f0: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
e100: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
e110: 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
e120: 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29  level, fullSync)
e130: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
e140: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
e150: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e160: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
e170: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
e180: 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
e190: 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
e1a0: 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
e1b0: 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
e1c0: 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
e1d0: 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
e1e0: 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
e1f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
e200: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
e210: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
e220: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
e230: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
e240: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e250: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
e260: 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
e270: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e280: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
e290: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
e2a0: 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
e2b0: 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
e2c0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
e2d0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
e2e0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
e2f0: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
e300: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
e310: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
e320: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e330: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
e340: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
e350: 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
e360: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
e370: 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
e380: 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
e390: 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
e3a0: 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
e3b0: 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
e3c0: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
e3d0: 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
e3e0: 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
e3f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
e400: 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
e410: 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
e420: 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
e430: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
e440: 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
e450: 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
e460: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
e470: 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
e480: 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
e490: 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
e4a0: 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
e4b0: 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
e4c0: 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
e4d0: 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
e4e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
e4f0: 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
e500: 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
e510: 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
e520: 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
e530: 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
e540: 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
e550: 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
e560: 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
e570: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
e580: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
e590: 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
e5a0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
e5b0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
e5c0: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
e5d0: 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
e5e0: 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
e5f0: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
e600: 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
e610: 68 65 20 70 61 67 65 53 69 7a 65 46 69 78 65 64  he pageSizeFixed
e620: 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
e630: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
e640: 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
e650: 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
e660: 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
e670: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
e680: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
e690: 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
e6a0: 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
e6b0: 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
e6c0: 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
e6d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
e6e0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
e6f0: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
e700: 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
e710: 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
e720: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e730: 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
e740: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
e750: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
e760: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
e770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
e780: 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
e790: 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
e7a0: 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
e7b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
e7c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
e7d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
e7e0: 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
e7f0: 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
e800: 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
e810: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
e820: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
e830: 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
e840: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
e850: 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
e860: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
e870: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
e880: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
e890: 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d  >pPage1 && !pBt-
e8a0: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
e8b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
e8c0: 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
e8d0: 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
e8e0: 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  (pBt);.    rc = 
e8f0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
e900: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
e910: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
e920: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  ize);.  }.  pBt-
e930: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
e940: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
e950: 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
e960: 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70  f( iFix ) pBt->p
e970: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
e980: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
e990: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
e9a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e9b0: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
e9c0: 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
e9d0: 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
e9e0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
e9f0: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
ea00: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
ea10: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
ea20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
ea30: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
ea40: 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
ea50: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
ea60: 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
ea70: 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
ea80: 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
ea90: 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
eaa0: 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
eab0: 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
eac0: 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f  y extensions..*/
ead0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
eae0: 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65  eGetReserve(Btre
eaf0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
eb00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
eb10: 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d  ter(p);.  n = p-
eb20: 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
eb30: 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
eb40: 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ize;.  sqlite3Bt
eb50: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
eb60: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
eb70: 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
eb80: 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
eb90: 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
eba0: 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
ebb0: 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
ebc0: 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
ebd0: 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
ebe0: 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
ebf0: 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
ec00: 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
ec10: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
ec20: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
ec30: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
ec40: 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
ec50: 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
ec60: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
ec70: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
ec80: 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
ec90: 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
eca0: 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
ecb0: 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
ecc0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
ecd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
ece0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
ecf0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ed00: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
ed10: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
ed20: 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
ed30: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
ed40: 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
ed50: 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
ed60: 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
ed70: 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
ed80: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
ed90: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
eda0: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
edb0: 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
edc0: 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
edd0: 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
ede0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
edf0: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
ee00: 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
ee10: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
ee20: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
ee30: 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
ee40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
ee50: 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
ee60: 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
ee70: 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
ee80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ee90: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
eea0: 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
eeb0: 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
eec0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
eed0: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
eee0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
eef0: 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
ef00: 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
ef10: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
ef20: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
ef30: 65 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31  eFixed && (av ?1
ef40: 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
ef50: 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
ef60: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
ef70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ef80: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
ef90: 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
efa0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
efb0: 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
efc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
efd0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
efe0: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
eff0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
f000: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
f010: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
f020: 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
f030: 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
f040: 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
f050: 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
f060: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
f070: 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
f080: 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
f090: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f0a0: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
f0b0: 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
f0c0: 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
f0d0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
f0e0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
f0f0: 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
f100: 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
f110: 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
f120: 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
f130: 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
f140: 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
f150: 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
f160: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
f170: 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
f180: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
f190: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
f1a0: 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
f1b0: 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
f1c0: 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
f1d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
f1e0: 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
f1f0: 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
f200: 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
f210: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
f220: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
f230: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
f240: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
f250: 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
f260: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
f270: 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
f280: 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
f290: 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
f2a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
f2b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
f2c0: 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
f2d0: 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
f2e0: 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
f2f0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
f300: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
f310: 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
f320: 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
f330: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
f340: 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  e1;.  int nPage;
f350: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
f360: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f370: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f380: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
f390: 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
f3a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
f3b0: 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
f3c0: 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
f3d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
f3e0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
f3f0: 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
f400: 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
f410: 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
f420: 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
f430: 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
f440: 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
f450: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f460: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
f470: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
f480: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f490: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
f4a0: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
f4b0: 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  iled;.  }else if
f4c0: 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
f4d0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20   int pageSize;. 
f4e0: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
f4f0: 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
f500: 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
f510: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
f520: 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66  E_NOTADB;.    if
f530: 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
f540: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
f550: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
f560: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
f570: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
f580: 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
f590: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
f5a0: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
f5b0: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
f5c0: 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
f5d0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
f5e0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
f5f0: 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
f600: 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
f610: 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  on must be exact
f620: 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65  ly 25%.  And the
f630: 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
f640: 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
f650: 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20  n must be 12.5% 
f660: 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61  for both leaf-da
f670: 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d  ta and non-leaf-
f680: 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65  data..    ** The
f690: 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
f6a0: 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
f6b0: 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
f6c0: 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
f6d0: 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
f6e0: 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
f6f0: 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
f700: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
f710: 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
f720: 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
f730: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
f740: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
f750: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
f760: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
f770: 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a  te(&page1[16]);.
f780: 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
f790: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
f7a0: 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35  =0 || pageSize<5
f7b0: 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53  12 ||.        (S
f7c0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
f7d0: 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67  IZE<32768 && pag
f7e0: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
f7f0: 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20  _PAGE_SIZE).    
f800: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
f810: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
f820: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
f830: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
f840: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62  )==0 );.    usab
f850: 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
f860: 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
f870: 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21     if( pageSize!
f880: 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
f890: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
f8a0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
f8b0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
f8c0: 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
f8d0: 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
f8e0: 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
f8f0: 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
f900: 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
f910: 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
f920: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
f930: 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
f940: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
f950: 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
f960: 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
f970: 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
f980: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
f990: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
f9a0: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
f9b0: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
f9c0: 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
f9d0: 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
f9e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
f9f0: 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
fa00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
fa10: 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73  leSize = (u16)us
fa20: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
fa30: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
fa40: 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
fa50: 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
fa60: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  ce(pBt);.      s
fa70: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
fa80: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
fa90: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
faa0: 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
fab0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
fac0: 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c   }.    if( usabl
fad0: 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20  eSize<500 ){.   
fae0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
faf0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
fb00: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
fb10: 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
fb20: 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
fb30: 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
fb40: 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
fb50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
fb60: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
fb70: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
fb80: 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
fb90: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
fba0: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
fbb0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
fbc0: 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
fbd0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
fbe0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
fbf0: 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
fc00: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
fc10: 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
fc20: 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
fc30: 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
fc40: 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
fc50: 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
fc60: 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
fc70: 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
fc80: 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
fc90: 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
fca0: 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
fcb0: 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
fcc0: 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
fcd0: 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
fce0: 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
fcf0: 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
fd00: 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
fd10: 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
fd20: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
fd30: 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
fd40: 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
fd50: 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
fd60: 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
fd70: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
fd80: 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
fd90: 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
fda0: 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c  a 2-byte poiner,
fdb0: 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
fdc0: 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
fdd0: 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
fde0: 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
fdf0: 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
fe00: 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
fe10: 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
fe20: 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
fe30: 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
fe40: 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
fe50: 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
fe60: 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 23;.  pBt->mi
fe70: 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  nLocal = (pBt->u
fe80: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
fe90: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
fea0: 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
feb0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
fec0: 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
fed0: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
fee0: 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
fef0: 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70   23;.  assert( p
ff00: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
ff10: 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
ff20: 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
ff30: 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
ff40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ff50: 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
ff60: 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
ff70: 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
ff80: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
ff90: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
ffa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ffb0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
ffc0: 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63   lockBtree() exc
ffd0: 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f  ept that it also
ffe0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
fff0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
10000 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63   there is lock c
10010 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ontention..*/.st
10020 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
10030 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65  eeWithRetry(Btre
10040 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20  e *pRef){.  int 
10050 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10060 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10070 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
10080 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28  x(pRef) );.  if(
10090 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d   pRef->inTrans==
100a0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
100b0 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69    u8 inTransacti
100c0 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e  on = pRef->pBt->
100d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
100e0 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
100f0 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20  y(pRef);.    rc 
10100 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
10110 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30  ginTrans(pRef, 0
10120 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74  );.    pRef->pBt
10130 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
10140 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  = inTransaction;
10150 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61  .    pRef->inTra
10160 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
10170 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10190 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  pRef->pBt->nTran
101a0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d  saction--;.    }
101b0 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
101c0 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20  ity(pRef);.  }. 
101d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20   return rc;.}.  
101e0 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20       ../*.** If 
101f0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
10200 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
10210 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
10220 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
10230 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
10240 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
10250 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
10260 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
10270 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
10280 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
10290 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
102a0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
102b0 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
102c0 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
102d0 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
102e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
102f0 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  are any outstand
10300 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69  ing cursors, thi
10310 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10320 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
10330 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
10340 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
10350 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10360 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10370 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
10380 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
10390 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
103a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
103b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
103c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
103d0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
103e0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
103f0 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  && pBt->pCursor=
10400 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  =0 && pBt->pPage
10410 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  1!=0 ){.    if( 
10420 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
10430 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
10440 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73  )>=1 ){.      as
10450 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
10460 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
10470 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
10480 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
10490 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  }.    pBt->pPage
104a0 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1 = 0;.  }.}../*
104b0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
104c0 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
104d0 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
104e0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a  rst page of the.
104f0 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
10500 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
10510 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
10520 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10530 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
10540 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
10550 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  rc;.  int nPage;
10560 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
10570 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10580 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10590 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
105a0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
105b0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
105c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
105d0 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20  E_OK || nPage>0 
105e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
105f0 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
10600 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
10610 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
10620 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
10630 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
10640 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
10650 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
10660 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
10670 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
10680 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
10690 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
106a0 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
106b0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
106c0 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75  der)==16 );.  pu
106d0 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d  t2byte(&data[16]
106e0 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
106f0 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
10700 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
10710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
10720 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
10730 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
10740 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
10750 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
10760 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
10770 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
10780 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
10790 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
107a0 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
107b0 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
107c0 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
107d0 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
107e0 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
107f0 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
10800 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
10810 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
10820 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
10830 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
10840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10850 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
10860 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
10870 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
10880 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
10890 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
108a0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
108b0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
108c0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
108d0 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
108e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
108f0 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
10900 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
10910 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
10920 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
10930 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10940 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
10950 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
10960 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
10970 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
10980 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
10990 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
109a0 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
109b0 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
109c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
109d0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
109e0 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
109f0 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
10a00 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
10a10 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
10a20 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
10a30 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
10a40 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
10a50 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
10a60 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
10a70 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
10a80 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
10a90 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
10aa0 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
10ab0 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
10ac0 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
10ad0 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
10ae0 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
10af0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
10b00 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
10b10 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
10b20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
10b30 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
10b40 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
10b50 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
10b60 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
10b70 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
10b80 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
10b90 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
10ba0 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
10bb0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
10bc0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
10bd0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
10be0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
10bf0 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
10c00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
10c10 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
10c20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
10c30 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
10c40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
10c50 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
10c60 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
10c70 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
10c80 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
10c90 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
10ca0 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
10cb0 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
10cc0 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
10cd0 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
10ce0 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
10cf0 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
10d00 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
10d10 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
10d20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
10d30 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
10d40 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
10d50 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
10d60 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
10d70 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
10d80 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
10d90 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
10da0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
10db0 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
10dc0 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
10dd0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
10de0 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
10df0 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
10e00 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
10e10 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
10e20 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
10e30 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
10e40 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
10e50 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
10e60 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
10e70 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
10e80 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
10e90 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
10ea0 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
10eb0 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
10ec0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
10ed0 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
10ee0 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
10ef0 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
10f00 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
10f10 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
10f20 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
10f30 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
10f40 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
10f50 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
10f60 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
10f70 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
10f80 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
10f90 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
10fa0 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
10fb0 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
10fc0 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
10fd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10fe0 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
10ff0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
11000 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  flag){.  sqlite3
11010 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
11020 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11030 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
11040 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
11050 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11060 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
11070 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
11080 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
11090 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
110a0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
110b0 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
110c0 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
110d0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
110e0 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
110f0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
11100 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
11110 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
11120 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
11130 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
11140 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
11150 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
11160 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
11170 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
11180 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
11190 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
111a0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
111b0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
111c0 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
111d0 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
111e0 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
111f0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11200 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
11210 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
11220 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
11230 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
11240 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
11250 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
11260 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
11270 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
11280 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
11290 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
112a0 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
112b0 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
112c0 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
112d0 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
112e0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
112f0 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
11300 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
11310 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
11320 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69  WRITE) || pBt->i
11330 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20  sPending ){.    
11340 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
11350 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
11360 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
11370 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
11380 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
11390 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
113a0 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
113b0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
113c0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
113d0 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
113e0 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
113f0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
11400 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11410 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11420 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
11430 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
11440 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
11450 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
11460 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
11470 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
11480 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
11490 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
114a0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ..  do {.    /* 
114b0 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
114c0 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
114d0 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
114e0 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
114f0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
11500 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
11510 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
11520 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
11530 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
11540 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
11550 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
11560 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
11570 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
11580 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
11590 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
115a0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
115b0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
115c0 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
115d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
115e0 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
115f0 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
11600 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
11610 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
11620 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
11630 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
11640 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
11650 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
11660 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
11670 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
11680 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
11690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
116a0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
116b0 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
116c0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
116d0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
116e0 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
116f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11700 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
11710 42 74 2d 3e 70 50 61 67 65 72 2c 20 77 72 66 6c  Bt->pPager, wrfl
11720 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ag>1);.        i
11730 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
11750 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
11760 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
11770 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
11780 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
117a0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
117b0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
117c0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
117d0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
117e0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
117f0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
11800 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
11810 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
11820 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
11830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11840 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
11850 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
11860 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
11870 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
11880 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
11890 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
118a0 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
118b0 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
118c0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
118d0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
118e0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
118f0 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
11900 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ns;.    }.#ifnde
11910 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
11920 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69  ARED_CACHE.    i
11930 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
11940 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
11950 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
11960 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
11970 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   p;.      pBt->i
11980 73 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38  sExclusive = (u8
11990 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20  )(wrflag>1);.   
119a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a   }.#endif.  }...
119b0 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
119c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
119d0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
119e0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
119f0 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
11a00 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
11a10 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
11a20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
11a30 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
11a40 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
11a50 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
11a60 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
11a70 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
11a80 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
11a90 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
11aa0 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
11ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
11ac0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
11ad0 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
11ae0 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
11af0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
11b00 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
11b10 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
11b20 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
11b40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11b50 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
11b60 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
11b70 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
11b80 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
11b90 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
11ba0 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
11bb0 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
11bc0 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
11bd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
11be0 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
11bf0 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
11c00 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
11c10 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
11c20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
11c30 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
11c40 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
11c50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c70 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
11c80 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
11c90 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11cb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
11cc0 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
11cd0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
11d00 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
11d10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
11d20 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49  e->pBt;.  u8 isI
11d30 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
11d40 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
11d50 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
11d60 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
11d70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11d80 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
11d90 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
11da0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
11db0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
11dc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11dd0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
11de0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
11df0 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
11e00 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
11e10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
11e20 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
11e30 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
11e40 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
11e50 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
11e60 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
11e70 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
11e80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11e90 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  .      goto set_
11ea0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
11eb0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
11ec0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
11ed0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
11ee0 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
11ef0 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
11f00 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
11f10 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
11f20 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
11f30 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
11f40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
11f50 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
11f60 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  maps_out;.    }.
11f70 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
11f80 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
11f90 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
11fa0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
11fb0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
11fc0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
11fd0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
11fe0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
11ff0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
12000 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  no);.  }..set_ch
12010 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
12020 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
12030 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
12040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12050 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
12060 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68 20 69  n pPage, which i
12070 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
12080 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 2c  be a btree page,
12090 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77   not an overflow
120a0 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70  .** page, is a p
120b0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
120c0 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69  From. Modify thi
120d0 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61  s pointer so tha
120e0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
120f0 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  * iTo. Parameter
12100 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
12110 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
12120 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66  nter to be modif
12130 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c  ied, as .** foll
12140 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
12150 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
12160 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
12170 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
12180 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
12190 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
121a0 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
121b0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
121c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
121d0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
121e0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
121f0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
12200 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
12220 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
12230 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
12240 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
12250 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
12260 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
12270 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
12280 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
12290 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
122c0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
122d0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
122e0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
122f0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
12300 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
12310 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
12320 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12330 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
12340 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
12350 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12360 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
12370 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
12380 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
12390 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
123a0 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
123b0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
123c0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
123d0 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
123e0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
123f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
12400 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
12410 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
12420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12430 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
12440 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
12450 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
12460 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
12470 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
12480 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
12490 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
124a0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
124b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
124c0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
124d0 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
124e0 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
124f0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
12500 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
12510 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
12520 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
12530 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
12540 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
12550 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
12560 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73   info;.        s
12570 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
12580 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
12590 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
125a0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
125b0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
125c0 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
125d0 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
125e0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
125f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
12600 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
12610 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
12620 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
12630 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
12650 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12660 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
12670 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
12680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
12690 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
126a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
126b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
126c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
126d0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
126e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
126f0 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
12700 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
12710 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
12720 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
12730 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
12740 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
12750 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12760 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
12770 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
12780 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
12790 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
127a0 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
127b0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
127c0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
127d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
127e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
127f0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
12800 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
12810 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
12820 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
12830 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
12840 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
12850 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
12860 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  valid..*/.static
12870 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
12880 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
12890 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
128a0 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
128b0 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
128c0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
128d0 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
128e0 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
128f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12900 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
12910 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
12920 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
12930 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
12940 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
12950 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
12960 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
12970 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
12980 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
12990 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
129a0 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
129b0 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20  nt isCommit.){. 
129c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
129d0 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
129e0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
129f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
12a00 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
12a10 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
12a20 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
12a30 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
12a40 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
12a50 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
12a60 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
12a70 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
12a80 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
12a90 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
12aa0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
12ab0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
12ac0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
12ad0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12ae0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
12af0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
12b00 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
12b10 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
12b20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
12b30 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
12b40 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
12b50 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
12b60 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
12b70 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
12b80 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
12b90 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
12ba0 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
12bb0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
12bc0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
12bd0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
12be0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
12bf0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
12c00 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
12c10 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
12c20 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
12c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12c40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12c50 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
12c60 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
12c70 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
12c80 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
12c90 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
12ca0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
12cb0 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
12cc0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
12cd0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
12ce0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
12cf0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
12d00 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
12d10 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
12d20 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
12d30 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
12d40 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
12d50 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
12d60 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
12d70 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
12d80 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
12d90 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
12da0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
12db0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
12dc0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
12dd0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
12de0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
12df0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
12e00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
12e10 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
12e20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
12e30 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
12e40 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
12e50 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
12e60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12e70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
12e80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
12ea0 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
12eb0 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
12ec0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
12ed0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
12ee0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
12ef0 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
12f00 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
12f10 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a  W2, iFreePage);.
12f20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12f40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12f50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12f60 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
12f70 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
12f80 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
12f90 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
12fa0 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
12fb0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
12fc0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
12fd0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
12fe0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
12ff0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
13000 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
13010 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
13020 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
13030 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
13040 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
13050 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
13060 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13070 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
13080 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
13090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
130a0 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
130b0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
130c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
130d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
130e0 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
130f0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
13100 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
13110 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
13120 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
13130 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
13140 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
13150 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
13160 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
13170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13180 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
13190 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
131a0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
131b0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
131c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
131d0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
131e0 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
131f0 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
13200 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
13210 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
13220 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
13230 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
13240 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
13250 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
13260 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
13270 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
13280 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
13290 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e  ssful,.** return
132a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
132b0 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
132c0 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
132d0 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74  fore no.** point
132e0 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   in calling this
132f0 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
13300 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
13310 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  DONE..**.** More
13320 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69   specificly, thi
13330 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
13340 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
13350 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ze the .** datab
13360 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ase so that the 
13370 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
13380 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
13390 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20  in use.** is no 
133a0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
133b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e  *.** If the nFin
133c0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
133d0 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c  n-zero, the impl
133e0 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d  ementation assum
133f0 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  es.** that the c
13400 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
13410 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
13420 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a  umStep() until.*
13430 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  * it returns SQL
13440 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65  ITE_DONE or an e
13450 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e  rror, and that n
13460 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  Fin is the.** nu
13470 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
13480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13490 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74  will contain aft
134a0 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63  er this .** proc
134b0 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ess is complete.
134c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
134d0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
134e0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
134f0 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
13500 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  stPg){.  Pgno nF
13510 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
13520 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13530 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
13540 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
13550 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13560 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
13570 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
13580 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
13590 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
135a0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
135b0 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
135c0 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
135d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
135e0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
135f0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
13600 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
13610 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
13620 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
13630 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
13640 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
13650 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
13660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
13670 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
13680 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
13690 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
136a0 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
136b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
136c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
136d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
136e0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
136f0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
13700 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
13710 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13720 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
13730 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
13740 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
13750 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29     if( nFin==0 )
13760 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
13770 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
13780 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
13790 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
137a0 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
137b0 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69      ** if nFin i
137c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
137d0 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
137e0 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
137f0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
13800 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
13810 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
13820 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
13830 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
13840 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
13850 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
13860 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
13870 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
13880 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
13890 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
138a0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
138b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
138c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
138d0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
138e0 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
138f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
13900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
13920 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
13930 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
13940 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
13950 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
13960 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
13970 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
13980 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
13990 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
139a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
139b0 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
139c0 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
139d0 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
139e0 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20  ge *pLastPg;..  
139f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13a00 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
13a10 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
13a20 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
13a30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13a40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
13a50 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
13a60 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e        /* If nFin
13a70 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
13a80 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
13a90 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
13aa0 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
13ab0 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
13ac0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
13ad0 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
13ae0 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
13af0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
13b00 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
13b10 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72  d, if nFin is gr
13b20 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
13b30 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
13b40 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
13b50 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
13b60 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
13b70 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
13b80 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
13b90 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
13ba0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13bb0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
13bc0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
13bd0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
13be0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
13bf0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
13c00 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  reePg, 0, 0);.  
13c10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13c30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
13c40 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
13c50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13c70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
13c80 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
13c90 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26  hile( nFin!=0 &&
13ca0 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
13cb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
13cc0 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
13cd0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
13ce0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13cf0 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70  Write(pLastPg->p
13d00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
13d10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13d20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13d30 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
13d40 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
13d50 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
13d60 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a  eePg, nFin!=0);.
13d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
13d80 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
13d90 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
13da0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13db0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13dd0 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d    }..  if( nFin=
13de0 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50  =0 ){.    iLastP
13df0 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g--;.    while( 
13e00 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
13e10 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c  _BYTE_PAGE(pBt)|
13e20 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  |PTRMAP_ISPAGE(p
13e30 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a  Bt, iLastPg) ){.
13e40 20 20 20 20 20 20 69 66 28 20 50 54 52 4d 41 50        if( PTRMAP
13e50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
13e60 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20  stPg) ){.       
13e70 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20   MemPage *pPg;. 
13e80 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
13e90 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
13ea0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
13eb0 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
13ec0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13ee0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13f00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13f10 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
13f20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
13f30 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
13f40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
13f50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13f60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13f70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13f80 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50    }.      iLastP
13f90 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g--;.    }.    s
13fa0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
13fb0 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
13fc0 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a  ager, iLastPg);.
13fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13fe0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13ff0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
14000 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
14010 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
14020 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
14030 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
14040 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
14050 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
14060 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
14070 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
14080 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
14090 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
140a0 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
140b0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
140c0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
140d0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
140e0 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
140f0 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
14100 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
14110 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14120 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
14130 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
14140 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
14150 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
14160 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
14170 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
14180 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
14190 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
141a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
141b0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
141c0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
141d0 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
141e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
141f0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
14200 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
14210 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
14220 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
14230 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
14240 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
14250 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
14260 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20  uumStep(pBt, 0, 
14270 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
14280 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Bt));.  }.  sqli
14290 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
142a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
142b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
142c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
142d0 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
142e0 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
142f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
14300 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72   is commited for
14310 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
14320 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
14330 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
14340 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
14350 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
14360 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
14370 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
14380 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
14390 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
143a0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
143b0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
143c0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
143d0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
143e0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
143f0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
14400 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
14410 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
14420 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
14430 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
14440 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
14450 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14460 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
14470 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
14480 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
14490 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
144a0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
144b0 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  ger) );..  asser
144c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
144d0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
144e0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
144f0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
14500 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
14510 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
14520 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
14530 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
14540 20 50 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20   Pgno nFin;.    
14550 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20  Pgno nFree;.    
14560 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20  Pgno nPtrmap;.  
14570 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20    Pgno iFree;.  
14580 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a    const int pgsz
14590 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
145a0 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  ;.    Pgno nOrig
145b0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
145c0 74 28 70 42 74 29 3b 0a 0a 20 20 20 20 69 66 28  t(pBt);..    if(
145d0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
145e0 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f  Bt, nOrig) || nO
145f0 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
14600 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
14610 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
14620 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72  t possible to cr
14630 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
14640 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
14650 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a  nal page.      *
14660 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f  * is either a po
14670 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f  inter-map page o
14680 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
14690 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a  te page. If one.
146a0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f        ** is enco
146b0 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e  untered, this in
146c0 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69  dicates corrupti
146d0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
146e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
146f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14700 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20     }..    nFree 
14710 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
14720 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
14730 36 5d 29 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70  6]);.    nPtrmap
14740 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
14750 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
14760 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35  t, nOrig)+pgsz/5
14770 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20  )/(pgsz/5);.    
14780 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
14790 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
147a0 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45      if( nOrig>PE
147b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
147c0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
147d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
147e0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
147f0 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n--;.    }.    w
14800 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
14810 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
14820 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
14830 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
14840 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
14850 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
14860 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
14870 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
14880 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
14890 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
148a0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
148b0 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a  , nFin, iFree);.
148c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
148d0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
148e0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
148f0 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
14900 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14910 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _OK;.      rc = 
14920 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
14930 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
14940 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
14950 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
14960 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
14970 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
14980 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
14990 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
149a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
149b0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
149c0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46  (pBt->pPager, nF
149d0 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
149e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
149f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14a00 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
14a10 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
14a20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
14a30 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
14a40 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
14a50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14a60 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  }..#endif /* ifn
14a70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14a80 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f  AUTOVACUUM */../
14a90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14aa0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
14ab0 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
14ac0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
14ad0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
14ae0 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
14af0 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
14b00 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
14b10 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
14b20 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
14b30 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
14b40 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
14b50 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
14b60 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
14b70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
14b80 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
14b90 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
14ba0 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
14bb0 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
14bc0 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
14bd0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
14be0 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
14bf0 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
14c00 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
14c10 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
14c20 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
14c30 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
14c40 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
14c50 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
14c60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
14c70 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
14c80 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
14c90 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
14ca0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
14cb0 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
14cc0 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
14cd0 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
14ce0 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
14cf0 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
14d00 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
14d10 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
14d20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
14d30 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
14d40 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
14d50 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
14d60 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
14d70 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
14d80 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
14d90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
14da0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
14db0 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
14dc0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
14dd0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
14de0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
14df0 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
14e00 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
14e10 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
14e20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
14e30 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
14e40 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
14e50 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
14e60 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
14e70 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
14e80 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
14e90 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
14ea0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
14eb0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
14ec0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
14ed0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
14ee0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
14ef0 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
14f00 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
14f10 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
14f20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
14f30 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
14f40 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
14f50 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
14f60 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
14f70 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
14f80 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
14f90 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
14fa0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
14fb0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
14fc0 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
14fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
14fe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14ff0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
15000 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
15010 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
15020 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15030 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
15040 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
15050 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
15060 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15070 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
15080 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
15090 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
150a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
150b0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
150c0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
150d0 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
150e0 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
150f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15100 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15110 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
15120 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
15130 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
15140 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
15150 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
15160 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
15170 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
15180 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
15190 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
151a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
151b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
151c0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
151d0 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
151e0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
151f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
15200 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
15210 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
15220 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
15230 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
15240 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
15250 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
15260 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
15270 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
15280 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
15290 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
152a0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
152b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
152c0 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
152d0 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
152e0 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
152f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
15300 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
15310 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
15320 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
15330 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
15340 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
15350 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
15360 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
15370 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
15380 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
15390 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
153a0 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
153b0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
153c0 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
153d0 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
153e0 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
153f0 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54  p locks..**.** T
15400 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
15410 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
15420 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15430 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
15440 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
15450 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
15460 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
15470 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
15480 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15490 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
154a0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
154b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
154c0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
154d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
154e0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
154f0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
15500 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
15510 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
15520 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
15530 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
15540 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
15550 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
15560 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
15570 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
15580 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
15590 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
155a0 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
155b0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
155c0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
155d0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
155e0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
155f0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
15600 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
15610 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
15620 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15640 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15650 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15660 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15670 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69      }.    pBt->i
15680 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
15690 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
156a0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
156b0 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20  le has any kind 
156c0 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
156d0 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
156e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
156f0 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65   ** count of the
15700 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
15710 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
15720 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  n count reaches 
15730 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20  0, set.  ** the 
15740 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
15750 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
15760 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15770 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77  sed() call below
15780 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63  .  ** will unloc
15790 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  k the pager..  *
157a0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
157b0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
157c0 7b 0a 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68  {.    clearAllSh
157d0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
157e0 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 42 74 2d  cks(p);.    pBt-
157f0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
15800 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
15810 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
15820 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
15830 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
15840 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
15850 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
15860 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
15870 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
15880 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
15890 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
158a0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
158b0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
158c0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
158d0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
158e0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
158f0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d  ntent(pBt);.  p-
15900 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
15910 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42  _NONE;.  unlockB
15920 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
15930 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  );..  btreeInteg
15940 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
15950 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15960 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15970 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
15980 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
15990 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
159a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
159b0 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
159c0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
159d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
159e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
159f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
15a00 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
15a10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15a20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15a30 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
15a40 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73  eTwo(p);.  }.  s
15a50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15a60 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
15a70 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
15a80 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
15a90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
15aa0 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
15ab0 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
15ac0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
15ad0 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
15ae0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
15af0 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
15b00 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
15b10 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
15b20 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
15b30 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
15b40 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
15b50 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
15b60 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
15b70 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
15b80 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
15b90 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
15ba0 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
15bb0 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
15bc0 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
15bd0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
15be0 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
15bf0 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
15c00 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
15c10 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
15c20 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
15c30 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
15c40 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
15c50 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
15c60 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
15c70 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
15c80 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
15c90 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
15ca0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
15cb0 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
15cc0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
15cd0 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
15ce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
15cf0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
15d00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
15d10 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
15d20 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
15d30 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
15d40 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
15d50 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
15d60 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
15d70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
15d80 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
15d90 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
15da0 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
15db0 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
15dc0 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
15dd0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15de0 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
15df0 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
15e00 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
15e10 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
15e20 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
15e30 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
15e40 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
15e50 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
15e60 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
15e70 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
15e80 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
15e90 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
15ea0 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
15eb0 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
15ec0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
15ed0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
15ee0 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
15ef0 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
15f00 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
15f10 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
15f20 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
15f30 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
15f40 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
15f50 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
15f60 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
15f70 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
15f80 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
15f90 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
15fa0 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
15fb0 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
15fc0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
15fd0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
15fe0 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
15ff0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
16000 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
16010 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
16020 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
16030 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
16040 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
16050 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b  >skip = errCode;
16060 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16070 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  =p->iPage; i++){
16080 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
16090 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
160a0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67  ;.      p->apPag
160b0 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
160c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
160d0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
160e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
160f0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
16100 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
16110 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
16120 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
16130 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
16140 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
16150 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
16160 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
16170 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
16180 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
16190 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
161a0 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
161b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
161c0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
161d0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
161e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
161f0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
16200 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
16210 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
16220 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
16230 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
16240 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
16250 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
16260 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
16270 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16280 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
16290 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
162a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
162b0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
162c0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
162d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
162e0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
162f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16300 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
16310 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
16320 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
16330 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
16340 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
16350 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
16360 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
16370 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
16380 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
16390 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
163a0 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
163b0 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
163c0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
163d0 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
163e0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
163f0 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
16400 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
16410 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
16420 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
16430 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
16440 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
16450 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
16460 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
16470 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
16480 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
16490 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
164a0 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
164b0 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
164c0 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
164d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
164e0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
164f0 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  rc);.  }.#endif.
16500 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
16510 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
16520 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
16530 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
16540 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
16550 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
16560 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
16570 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
16580 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
16590 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
165a0 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
165b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
165c0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
165d0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
165e0 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
165f0 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
16600 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
16610 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
16620 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  l sqlite3BtreeGe
16630 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
16640 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
16650 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
16660 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
16670 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
16680 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
16690 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
166a0 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
166b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
166c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
166d0 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
166e0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
166f0 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
16700 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
16710 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
16720 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
16730 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
16740 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
16750 0a 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61  .    clearAllSha
16760 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
16770 6b 73 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  ks(p);.    asser
16780 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
16790 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42  tion>0 );.    pB
167a0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
167b0 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
167c0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
167d0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
167e0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
167f0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
16800 20 20 7d 0a 0a 20 20 62 74 72 65 65 43 6c 65 61    }..  btreeClea
16810 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
16820 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  ;.  p->inTrans =
16830 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75   TRANS_NONE;.  u
16840 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
16850 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65  ed(pBt);..  btre
16860 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
16870 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16880 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16890 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
168a0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
168b0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
168c0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
168d0 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c  n can can be rol
168e0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
168f0 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
16900 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
16910 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
16920 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
16930 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
16940 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
16950 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
16960 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
16970 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
16980 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
16990 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
169a0 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
169b0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
169c0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
169d0 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
169e0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
169f0 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
16a00 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
16a10 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
16a20 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
16a30 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
16a40 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
16a50 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
16a60 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
16a70 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
16a80 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
16a90 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
16aa0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
16ab0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
16ac0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
16ad0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
16ae0 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
16af0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
16b00 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
16b10 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
16b20 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
16b30 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
16b40 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
16b50 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
16b60 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
16b70 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
16b80 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
16b90 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
16ba0 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
16bb0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
16bc0 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
16bd0 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
16be0 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
16bf0 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
16c00 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
16c10 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
16c20 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
16c30 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
16c40 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
16c50 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
16c60 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
16c70 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
16c80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
16c90 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
16ca0 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
16cb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
16cc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16cd0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
16ce0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16cf0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
16d00 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
16d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
16d20 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  t->readOnly==0 )
16d30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
16d40 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
16d50 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
16d60 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
16d70 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  nt );.  if( NEVE
16d80 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  R(p->inTrans!=TR
16d90 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74  ANS_WRITE || pBt
16da0 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
16db0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
16dc0 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65  NTERNAL;.  }else
16dd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
16de0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
16df0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
16e00 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20 70  .    /* At the p
16e10 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
16e20 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
16e30 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
16e40 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61  nt with.    ** a
16e50 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
16e60 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
16e70 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
16e80 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 20  icitly using.   
16e90 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
16ea0 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
16eb0 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
16ec0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
16ed0 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73  ny.    ** such s
16ee0 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
16ef0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
16f00 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
16f10 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
16f20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
16f30 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
16f40 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
16f50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
16f60 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
16f70 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16f90 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
16fa0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
16fb0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
16fc0 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
16fd0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
16fe0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
16ff0 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
17000 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
17010 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
17020 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
17030 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
17040 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
17050 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
17060 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
17070 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
17080 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
17090 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
170a0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
170b0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
170c0 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
170d0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
170e0 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
170f0 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
17100 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
17110 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
17120 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
17130 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
17140 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
17150 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
17160 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
17170 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
17180 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
17190 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
171a0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
171b0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
171c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
171d0 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
171e0 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
171f0 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
17200 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17210 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
17220 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
17230 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
17240 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17250 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
17260 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
17270 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
17280 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
17290 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
172a0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
172b0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
172c0 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
172d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
172e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
172f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
17300 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
17310 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
17320 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
17330 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
17340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17350 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
17360 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
17370 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
17380 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
17390 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
173a0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
173b0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
173c0 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
173d0 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
173e0 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
173f0 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
17400 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
17410 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
17420 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
17430 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
17440 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
17450 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
17460 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
17470 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
17480 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
17490 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
174a0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
174b0 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
174c0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
174d0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
174e0 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
174f0 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
17500 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
17510 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
17520 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
17530 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
17540 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
17550 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
17560 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
17570 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
17580 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
17590 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
175a0 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
175b0 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
175c0 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
175d0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
175e0 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
175f0 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
17600 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
17610 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
17620 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
17630 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
17640 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
17650 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
17660 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
17670 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
17680 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
17690 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
176a0 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
176b0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
176c0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
176d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
176e0 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
176f0 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
17700 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
17710 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
17720 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
17730 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
17740 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
17750 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
17760 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
17770 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
17780 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
17790 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
177a0 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
177b0 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
177c0 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
177d0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
177e0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
177f0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
17800 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29  treeCursorSize()
17810 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
17820 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20   .** pointed to 
17830 62 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65  by pCur have bee
17840 6e 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20  n zeroed by the 
17850 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
17860 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
17870 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
17880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
178a0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
178b0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178d0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
178e0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
178f0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
17900 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17920 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
17930 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
17940 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
17950 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
17960 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
17970 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
17980 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
17990 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
179c0 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
179d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
179e0 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74  Pgno nPage;.  Bt
179f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17a00 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
17a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
17a20 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
17a30 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
17a40 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
17a50 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ;.  if( wrFlag )
17a60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
17a70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
17a80 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 42      if( NEVER(pB
17a90 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  t->readOnly) ){.
17aa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17ab0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
17ac0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 68 65    }.    rc = che
17ad0 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63  ckForReadConflic
17ae0 74 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c  ts(p, iTable, 0,
17af0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
17b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17b10 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
17b20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
17b30 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20  AREDCACHE );.   
17b40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17b50 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
17b60 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b  Bt->pPage1==0 ){
17b70 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74  .    rc = lockBt
17b80 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29 3b  reeWithRetry(p);
17b90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17ba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17bb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17bc0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e  .  }.  pCur->pgn
17bd0 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
17be0 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  able;.  rc = sql
17bf0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
17c00 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
17c10 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 29 3b 20  (int *)&nPage); 
17c20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17c30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
17c40 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
17c50 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 6e 50   iTable==1 && nP
17c60 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  age==0 ){.    rc
17c70 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b   = SQLITE_EMPTY;
17c80 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
17c90 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
17ca0 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  n;.  }.  rc = ge
17cb0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
17cc0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
17cd0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
17ce0 30 5d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  0]);.  if( rc!=S
17cf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17d00 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
17d10 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
17d20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
17d30 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
17d40 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
17d50 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
17d60 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
17d70 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20  variables, link 
17d80 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
17d90 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
17da0 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72  t and set *ppCur
17db0 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75   (the.  ** outpu
17dc0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
17dd0 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20  is function)..  
17de0 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  */.  pCur->pKeyI
17df0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
17e00 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
17e10 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
17e20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
17e30 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c  rFlag = (u8)wrFl
17e40 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
17e50 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
17e60 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
17e70 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
17e80 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
17e90 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
17ea0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
17eb0 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
17ec0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
17ed0 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64  ;.  pCur->cached
17ee0 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20 72 65  Rowid = 0;..  re
17ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17f00 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65  .create_cursor_e
17f10 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c 65  xception:.  rele
17f20 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
17f30 50 61 67 65 5b 30 5d 29 3b 0a 20 20 75 6e 6c 6f  Page[0]);.  unlo
17f40 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
17f50 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  pBt);.  return r
17f60 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
17f70 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
17f80 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17fb0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
17fc0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
17ff0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
18000 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
18010 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
18040 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
18050 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
18060 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
18070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18080 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
18090 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
180a0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
180b0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
180e0 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
180f0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
18100 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18110 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
18120 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
18130 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
18140 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
18150 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18170 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18180 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
18190 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
181a0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
181b0 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
181c0 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
181d0 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
181e0 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
181f0 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
18200 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
18210 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
18220 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
18230 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
18240 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
18250 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
18260 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
18270 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
18280 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
18290 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
182a0 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
182b0 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f  {.  return sizeo
182c0 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a  f(BtCursor);.}..
182d0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61  /*.** Set the ca
182e0 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65  ched rowid value
182f0 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72   of every cursor
18300 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
18310 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73  abase file.** as
18320 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67   pCur and having
18330 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70   the same root p
18340 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43  age number as pC
18350 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ur.  The value i
18360 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77  s.** set to iRow
18370 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70  id..**.** Only p
18380 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61  ositive rowid va
18390 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
183a0 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68  red valid for th
183b0 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65  is cache..** The
183c0 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61   cache is initia
183d0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69  lized to zero, i
183e0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76  ndicating an inv
183f0 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41  alid cache..** A
18400 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b   btree will work
18410 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20   fine with zero 
18420 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
18430 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e  ds.  We just can
18440 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72  not.** cache zer
18450 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
18460 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e  wids, which mean
18470 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73  s tables that us
18480 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67  e zero or.** neg
18490 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67  ative rowids mig
184a0 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
184b0 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20  slower.  But in 
184c0 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a  practice, zero.*
184d0 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  * or negative ro
184e0 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e  wids are very un
184f0 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73  common so this s
18500 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70  hould not be a p
18510 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
18520 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
18530 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
18540 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74  sor *pCur, sqlit
18550 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29  e3_int64 iRowid)
18560 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
18570 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70  .  for(p=pCur->p
18580 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
18590 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
185a0 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
185b0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
185c0 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69   ) p->cachedRowi
185d0 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  d = iRowid;.  }.
185e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
185f0 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f  cachedRowid==iRo
18600 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wid );.}../*.** 
18610 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65  Return the cache
18620 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  d rowid for the 
18630 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41  given cursor.  A
18640 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72   negative or zer
18650 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  o.** return valu
18660 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
18670 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
18680 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   is invalid and 
18690 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e  should be.** ign
186a0 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f  ored.  If the ro
186b0 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65  wid cache has ne
186c0 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
186d0 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a  set, then a.** z
186e0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
186f0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
18700 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  4 sqlite3BtreeGe
18710 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
18720 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
18730 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63  return pCur->cac
18740 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  hedRowid;.}../*.
18750 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
18760 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
18770 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
18780 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
18790 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
187a0 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
187b0 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
187c0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
187d0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
187e0 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
187f0 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
18800 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
18810 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
18820 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
18830 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
18840 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18850 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
18860 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
18870 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
18880 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
18890 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70  pPrev ){.      p
188a0 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
188b0 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
188c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
188d0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
188e0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
188f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
18900 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
18910 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
18920 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
18930 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  v;.    }.    for
18940 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
18950 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
18960 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
18970 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
18980 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
18990 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
189a0 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t);.    invalida
189b0 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
189c0 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71  pCur);.    /* sq
189d0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
189e0 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
189f0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
18a00 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
18a10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18a20 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70  *.** Make a temp
18a30 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20  orary cursor by 
18a40 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66  filling in the f
18a50 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75  ields of pTempCu
18a60 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72  r..** The tempor
18a70 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  ary cursor is no
18a80 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  t on the cursor 
18a90 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72  list for the Btr
18aa0 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
18ab0 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
18ac0 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
18ad0 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a  pCur, BtCursor *
18ae0 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 69 6e 74  pTempCur){.  int
18af0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   i;.  assert( cu
18b00 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
18b10 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  Cur) );.  memcpy
18b20 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c  (pTempCur, pCur,
18b30 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72   sizeof(BtCursor
18b40 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e  ));.  pTempCur->
18b50 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65  pNext = 0;.  pTe
18b60 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30  mpCur->pPrev = 0
18b70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
18b80 70 54 65 6d 70 43 75 72 2d 3e 69 50 61 67 65 3b  pTempCur->iPage;
18b90 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
18ba0 65 33 50 61 67 65 72 52 65 66 28 70 54 65 6d 70  e3PagerRef(pTemp
18bb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
18bc0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
18bd0 61 73 73 65 72 74 28 20 70 54 65 6d 70 43 75 72  assert( pTempCur
18be0 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a 7d 0a 0a  ->pKey==0 );.}..
18bf0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74  /*.** Delete a t
18c00 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
18c10 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65  such as was made
18c20 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65   by the CreateTe
18c30 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a  mporaryCursor().
18c40 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  ** function abov
18c50 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
18c60 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
18c70 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
18c80 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
18c90 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  i;.  assert( cur
18ca0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
18cb0 75 72 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ur) );.  for(i=0
18cc0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
18cd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
18ce0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43  te3PagerUnref(pC
18cf0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70  ur->apPage[i]->p
18d00 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73  DbPage);.  }.  s
18d10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
18d20 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 0a 0a 0a 2f 2a  ->pKey);.}..../*
18d30 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
18d40 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
18d50 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
18d60 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
18d70 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
18d80 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
18d90 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
18da0 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73  valid, call.** s
18db0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
18dc0 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
18dd0 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
18de0 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
18df0 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
18e00 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
18e10 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
18e20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
18e30 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
18e40 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
18e50 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
18e60 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32  eCell()..**.** 2
18e70 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72  007-06-25:  Ther
18e80 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f  e is a bug in so
18e90 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d  me versions of M
18ea0 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74  SVC that cause t
18eb0 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74  he.** compiler t
18ec0 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74  o crash when get
18ed0 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d  CellInfo() is im
18ee0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d  plemented as a m
18ef0 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65  acro..** But the
18f00 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61  re is a measurea
18f10 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74  ble speed advant
18f20 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65  age to using the
18f30 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a   macro on gcc.**
18f40 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70   (when less comp
18f50 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  iler optimizatio
18f60 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d  ns like -Os or -
18f70 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20  O0 are used and 
18f80 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
18f90 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72  is not doing agr
18fa0 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e  essive inlining.
18fb0 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72  )  So we use a r
18fc0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eal function.** 
18fd0 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d  for MSVC and a m
18fe0 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68  acro for everyth
18ff0 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65  ing else.  Ticke
19000 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e  t #2457..*/.#ifn
19010 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
19020 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
19030 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
19040 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
19050 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
19060 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
19070 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
19080 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
19090 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
190a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
190b0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
190c0 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72  age[iPage], pCur
190d0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20  ->aiIdx[iPage], 
190e0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
190f0 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
19100 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
19110 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
19120 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
19130 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
19140 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
19150 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a  #ifdef _MSC_VER.
19160 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20    /* Use a real 
19170 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43  function in MSVC
19180 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
19190 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d  bugs in that com
191a0 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74  piler. */.  stat
191b0 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
191c0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
191d0 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ur){.    if( pCu
191e0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
191f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
19200 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
19210 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
19220 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
19230 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
19240 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
19250 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
19260 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
19270 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
19280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19290 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
192a0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
192b0 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
192c0 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
192d0 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
192e0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
192f0 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
19300 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
19310 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
19320 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
19370 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
19380 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
193c0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
193d0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71          \.    sq
19410 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
19420 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
19430 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
19440 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
19450 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70  ->info); \.    p
19460 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
19470 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
194b0 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
19500 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
19510 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19540 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
19550 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43  }.#endif /* _MSC
19560 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  _VER */../*.** S
19570 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
19580 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
19590 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  fer needed to ho
195a0 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  ld the value of.
195b0 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74  ** the key for t
195c0 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
195d0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
195e0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
195f0 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65  .** to a valid e
19600 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20  ntry, *pSize is 
19610 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a  set to 0. .**.**
19620 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74   For a table wit
19630 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61  h the INTKEY fla
19640 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74  g set, this rout
19650 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
19660 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e  key.** itself, n
19670 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ot the number of
19680 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65   bytes in the ke
19690 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
196a0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
196b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
196c0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
196d0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
196e0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
196f0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
19700 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
19710 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
19720 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19730 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
19740 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19750 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
19760 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19770 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
19780 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
19790 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
197a0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  LID ){.      *pS
197b0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
197c0 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
197d0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
197e0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
197f0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
19800 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19810 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
19820 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
19830 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
19840 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
19850 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
19860 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
19870 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72  ts to.  Always r
19880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
19890 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
198a0 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66  ot possible.  If
198b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
198c0 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  ot currently.** 
198d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65  pointing to an e
198e0 6e 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20  ntry (which can 
198f0 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
19900 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64  ple, if.** the d
19910 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
19920 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73  ) then *pSize is
19930 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e   set to 0..*/.in
19940 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
19950 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
19960 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
19970 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
19980 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
19990 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
199a0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
199b0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
199c0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
199d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
199e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
199f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
19a00 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
19a10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
19a20 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
19a30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19a40 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
19a50 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69        /* Not poi
19a60 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64  nting at a valid
19a70 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53   entry - set *pS
19a80 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20  ize to 0. */.   
19a90 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
19aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19ab0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
19ac0 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  );.      *pSize 
19ad0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  = pCur->info.nDa
19ae0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
19af0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19b00 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
19b10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
19b20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
19b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
19b40 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
19b50 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
19b60 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
19b70 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
19b80 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
19b90 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
19ba0 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
19bb0 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
19bc0 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
19bd0 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
19be0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
19bf0 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
19c00 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
19c10 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
19c20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
19c30 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
19c40 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
19c50 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
19c60 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
19c70 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
19c80 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
19c90 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
19ca0 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
19cb0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
19cc0 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
19cd0 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
19ce0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
19cf0 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
19d00 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
19d10 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
19d20 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
19d30 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
19d40 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
19d50 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
19d60 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
19d70 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
19d80 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
19d90 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
19da0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
19db0 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
19dc0 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
19dd0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
19de0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
19df0 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
19e00 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
19e10 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
19e20 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
19e30 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
19e40 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
19e50 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
19e60 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
19e70 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
19e80 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
19e90 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
19ea0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
19eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
19ec0 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
19ed0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20  tShared *pBt, . 
19ee0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19f00 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a   Overflow page *
19f10 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
19f20 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
19f30 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
19f40 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
19f50 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
19f60 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
19f70 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
19f80 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
19f90 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
19fa0 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
19fb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
19fc0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
19fd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
19fe0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19ff0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a000 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a010 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
1a020 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a030 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1a040 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
1a050 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1a060 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1a070 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
1a080 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
1a090 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
1a0a0 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
1a0b0 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
1a0c0 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
1a0d0 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
1a0e0 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
1a0f0 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
1a100 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
1a110 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
1a120 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
1a130 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
1a140 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
1a150 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1a160 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
1a170 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
1a180 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1a190 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
1a1a0 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
1a1b0 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
1a1c0 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
1a1d0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1a1e0 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
1a1f0 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
1a200 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1a210 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
1a220 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
1a230 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72  f( iGuess<=pager
1a240 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
1a250 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
1a260 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
1a270 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
1a280 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1a290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1a2a0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1a2b0 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
1a2c0 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
1a2d0 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
1a2e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1a2f0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
1a300 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1a310 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  f..  if( rc==SQL
1a320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1a330 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1a340 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
1a350 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
1a360 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
1a370 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
1a380 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  =0);.    if( nex
1a390 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  t==0 && rc==SQLI
1a3a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
1a3b0 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
1a3c0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1a3d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
1a3e0 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
1a3f0 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
1a400 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
1a410 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1a420 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1a430 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1a440 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1a450 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
1a460 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
1a470 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
1a480 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
1a490 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
1a4a0 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
1a4b0 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
1a4c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
1a4d0 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
1a4e0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1a4f0 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
1a500 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
1a510 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
1a520 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
1a530 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
1a540 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
1a550 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
1a560 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
1a570 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
1a580 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a590 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
1a5a0 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
1a5b0 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
1a5c0 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
1a5d0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
1a5e0 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
1a5f0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1a600 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
1a610 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
1a620 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1a630 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1a640 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
1a650 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
1a660 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1a670 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
1a680 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a6a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
1a6b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
1a6c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1a6d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1a6e0 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
1a6f0 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
1a700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1a710 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
1a720 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
1a730 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
1a740 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
1a750 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
1a760 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
1a770 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
1a780 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
1a790 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
1a7a0 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
1a7b0 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
1a7c0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1a7d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a7e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1a7f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a800 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1a810 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
1a820 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
1a830 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
1a840 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
1a850 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
1a860 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
1a870 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
1a880 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1a890 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
1a8a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a8b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a8c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1a8d0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
1a8e0 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
1a8f0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
1a900 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
1a910 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
1a920 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
1a930 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20  ting to. If the 
1a940 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  eOp.** parameter
1a950 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61   is 0, this is a
1a960 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20   read operation 
1a970 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74  (data copied int
1a980 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
1a990 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d  ). If it is non-
1a9a0 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64  zero, a write (d
1a9b0 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  ata copied from.
1a9c0 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
1a9d0 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
1a9e0 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
1a9f0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1aa00 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
1aa10 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
1aa20 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
1aa30 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1aa40 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
1aa50 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
1aa60 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74   make a distinct
1aa70 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20  ion between key 
1aa80 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20  and data..** It 
1aa90 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72  just reads or wr
1aaa0 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20  ites bytes from 
1aab0 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61  the payload area
1aac0 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a  .  Data might .*
1aad0 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  * appear on the 
1aae0 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20  main page or be 
1aaf0 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
1ab00 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
1ab10 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a  ow .** pages..**
1ab20 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72  .** If the BtCur
1ab30 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61  sor.isIncrblobHa
1ab40 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
1ab50 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
1ab60 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72  t.** cursor entr
1ab70 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
1ab80 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
1ab90 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
1aba0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70  .** allocates sp
1abb0 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
1abc0 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65  ly popluates the
1abd0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1abe0 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72  ist .** cache ar
1abf0 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
1ac00 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71  verflow). Subseq
1ac10 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
1ac20 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20  his.** cache to 
1ac30 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
1ac40 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
1ac50 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65  set more efficie
1ac60 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
1ac70 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
1ac80 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
1ac90 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
1aca0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
1acb0 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
1acc0 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
1acd0 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
1ace0 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
1acf0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
1ad00 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
1ad10 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
1ad20 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
1ad30 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
1ad40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
1ad50 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
1ad60 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
1ad70 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
1ad80 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
1ad90 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
1ada0 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
1adb0 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
1adc0 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
1add0 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
1ade0 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
1adf0 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
1ae00 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
1ae10 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
1ae20 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
1ae30 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
1ae40 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1ae50 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
1ae60 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
1ae70 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
1ae80 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
1ae90 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
1aea0 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
1aeb0 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
1aec0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
1aed0 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
1aee0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1aef0 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
1af00 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
1af10 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
1af20 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20  nt skipKey,     
1af30 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65      /* offset be
1af40 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20  gins at data if 
1af50 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
1af60 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
1af70 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
1af80 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
1af90 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
1afa0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1afb0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
1afc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1afd0 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
1afe0 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
1aff0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1b000 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1b010 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
1b020 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
1b030 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
1b040 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b050 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
1b060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1b070 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
1b080 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
1b090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
1b0a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b0b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b0c0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1b0d0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1b0e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
1b0f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1b100 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b110 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b120 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ;..  getCellInfo
1b130 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
1b140 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
1b150 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e  pCell + pCur->in
1b160 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b  fo.nHeader;.  nK
1b170 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74  ey = (pPage->int
1b180 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70  Key ? 0 : (int)p
1b190 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b  Cur->info.nKey);
1b1a0 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  ..  if( skipKey 
1b1b0 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  ){.    offset +=
1b1c0 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28   nKey;.  }.  if(
1b1d0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b   offset+amt > nK
1b1e0 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
1b1f0 61 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61 79  ata .   || &aPay
1b200 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1b210 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
1b220 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
1b230 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20  bleSize].  ){.  
1b240 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
1b250 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
1b260 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1b270 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
1b280 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
1b290 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b2a0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
1b2b0 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
1b2c0 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
1b2d0 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
1b2e0 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
1b2f0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
1b300 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
1b310 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
1b320 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
1b330 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
1b340 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
1b350 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
1b360 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
1b370 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
1b380 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
1b390 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
1b3a0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
1b3b0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1b3c0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1b3d0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
1b3e0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
1b3f0 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
1b400 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
1b410 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  Local;.  }..  if
1b420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b430 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
1b440 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
1b450 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
1b460 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
1b470 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
1b480 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
1b490 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
1b4a0 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
1b4b0 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
1b4c0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
1b4d0 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66  ocal]);..#ifndef
1b4e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1b4f0 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20  RBLOB.    /* If 
1b500 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61  the isIncrblobHa
1b510 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
1b520 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f   and the BtCurso
1b530 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20  r.aOverflow[].  
1b540 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
1b550 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
1b560 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ocate it now. Th
1b570 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  e array is sized
1b580 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65   at.    ** one e
1b590 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
1b5a0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1b5b0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
1b5c0 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61  n. The.    ** pa
1b5d0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1b5e0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
1b5f0 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
1b600 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a  n aOverflow[0],.
1b610 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61      ** etc. A va
1b620 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
1b630 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
1b640 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  y means "not yet
1b650 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28   known".    ** (
1b660 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
1b670 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
1b680 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1b690 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
1b6a0 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e  andle && !pCur->
1b6b0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1b6c0 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
1b6d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
1b6e0 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
1b6f0 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
1b700 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
1b710 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
1b720 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69  w = (Pgno *)sqli
1b730 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1b740 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c  zeof(Pgno)*nOvfl
1b750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76  );.      if( nOv
1b760 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  fl && !pCur->aOv
1b770 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1b780 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1b790 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
1b7a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1b7b0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1b7c0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
1b7d0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
1b7e0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
1b7f0 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
1b800 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
1b810 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
1b820 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
1b830 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
1b840 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
1b850 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
1b860 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1b870 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
1b880 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
1b890 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
1b8a0 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
1b8b0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
1b8c0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
1b8d0 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
1b8e0 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
1b8f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1b900 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
1b910 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
1b920 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
1b930 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  +){..#ifndef SQL
1b940 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1b950 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  B.      /* If re
1b960 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
1b970 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1b980 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
1b990 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
1b9a0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1b9b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
1b9c0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1b9d0 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
1b9e0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
1b9f0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
1ba00 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
1ba10 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
1ba20 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ge;.      }.#end
1ba30 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  if..      if( of
1ba40 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
1ba50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1ba60 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
1ba70 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
1ba80 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
1ba90 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1baa0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
1bab0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1bac0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
1bad0 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
1bae0 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
1baf0 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
1bb00 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
1bb10 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
1bb20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
1bb30 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
1bb40 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
1bb50 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
1bb60 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
1bb70 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
1bb80 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65         */.#ifnde
1bb90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1bba0 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69  CRBLOB.        i
1bbb0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1bbc0 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1bbd0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
1bbe0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
1bbf0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
1bc00 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
1bc10 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23         } else .#
1bc20 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
1bc30 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
1bc40 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
1bc50 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
1bc60 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
1bc70 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
1bc80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bc90 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
1bca0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
1bcb0 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
1bcc0 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
1bcd0 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
1bce0 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
1bcf0 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
1bd00 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
1bd10 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
1bd20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50    */.        DbP
1bd30 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
1bd40 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
1bd50 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
1bd60 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1bd70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
1bd80 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29  tPage, &pDbPage)
1bd90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1bda0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bdb0 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
1bdc0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
1bdd0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
1bde0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
1bdf0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1be00 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
1be10 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
1be20 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
1be30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20  {.            a 
1be40 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
1be50 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  set;.          }
1be60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1be70 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
1be80 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
1be90 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
1bea0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1beb0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1bec0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
1bed0 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
1bee0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
1bef0 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
1bf00 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1bf10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1bf20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1bf30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bf40 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
1bf50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1bf60 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1bf70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1bf80 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
1bf90 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
1bfa0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
1bfb0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
1bfc0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
1bfd0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
1bfe0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
1bff0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
1c000 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
1c010 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
1c020 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1c030 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
1c040 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
1c050 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
1c060 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
1c070 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
1c080 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
1c090 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
1c0a0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
1c0b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c0c0 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
1c0d0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
1c0e0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
1c0f0 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
1c100 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1c110 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1c120 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1c130 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
1c140 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1c150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c160 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c170 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1c180 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1c190 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c1a0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
1c1b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1c1c0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28  Page] );.    if(
1c1d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
1c1e0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1c1f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c200 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c210 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1c220 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1c230 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
1c240 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1c250 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
1c260 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
1c270 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
1c280 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
1c290 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20   char*)pBuf, 0, 
1c2a0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1c2b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1c2c0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
1c2d0 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
1c2e0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
1c2f0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
1c300 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
1c310 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
1c320 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
1c330 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
1c340 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
1c350 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1c360 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1c370 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1c380 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1c390 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
1c3a0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1c3b0 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
1c3c0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
1c3d0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
1c3e0 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
1c3f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
1c400 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
1c410 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1c420 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1c430 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1c440 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c450 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
1c460 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
1c470 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1c480 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c490 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
1c4a0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1c4b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1c4c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1c4d0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1c4e0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1c4f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1c510 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1c520 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1c530 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1c540 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
1c550 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1c560 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20  r->iPage] );.   
1c570 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1c580 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1c590 5d 3c 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 2d 3e 6e 43 65  Cur->iPage]->nCe
1c5b0 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
1c5c0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
1c5d0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
1c5e0 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  pBuf, 1, 0);.  }
1c5f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c600 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1c610 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
1c620 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
1c630 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
1c640 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
1c650 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1c660 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
1c670 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
1c680 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
1c690 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
1c6a0 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
1c6b0 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1c6c0 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
1c6d0 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
1c6e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1c6f0 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
1c700 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
1c710 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
1c720 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
1c730 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
1c740 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
1c750 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
1c760 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
1c770 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
1c780 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
1c790 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
1c7a0 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
1c7b0 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
1c7c0 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
1c7d0 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
1c7e0 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
1c7f0 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
1c800 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
1c810 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
1c820 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
1c830 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
1c840 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
1c850 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
1c860 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
1c870 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
1c880 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
1c890 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
1c8a0 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
1c8b0 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
1c8c0 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
1c8d0 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
1c8e0 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
1c8f0 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
1c900 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
1c910 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
1c920 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
1c930 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
1c940 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
1c950 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1c960 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
1c970 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
1c980 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
1c990 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
1c9a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
1c9b0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
1c9c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74  signed char *fet
1c9d0 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
1c9e0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1c9f0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
1ca00 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
1ca10 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1ca20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20  int *pAmt,      
1ca30 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1ca40 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
1ca50 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
1ca60 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65   */.  int skipKe
1ca70 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  y          /* re
1ca80 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ad beginning at 
1ca90 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
1caa0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
1cab0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
1cac0 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20  load;.  MemPage 
1cad0 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b  *pPage;.  u32 nK
1cae0 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c  ey;.  u32 nLocal
1caf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
1cb00 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
1cb10 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1cb20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1cb30 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
1cb40 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1cb50 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1cb60 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1cb70 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1cb80 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
1cb90 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1cba0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
1cbb0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1cbc0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1cbd0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
1cbe0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1cbf0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1cc00 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
1cc10 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
1cc20 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1cc30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1cc40 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
1cc50 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1cc60 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43    nKey = (int)pC
1cc70 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1cc80 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79   }.  if( skipKey
1cc90 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64   ){.    aPayload
1cca0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c   += nKey;.    nL
1ccb0 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
1ccc0 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b  o.nLocal - nKey;
1ccd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1cce0 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
1ccf0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66  o.nLocal;.    if
1cd00 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b  ( nLocal>nKey ){
1cd10 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  .      nLocal = 
1cd20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
1cd30 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c    *pAmt = nLocal
1cd40 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c  ;.  return aPayl
1cd50 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
1cd60 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
1cd70 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
1cd80 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
1cd90 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
1cda0 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
1cdb0 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
1cdc0 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
1cdd0 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
1cde0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
1cdf0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1ce00 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
1ce10 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
1ce20 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
1ce30 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
1ce40 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
1ce50 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
1ce60 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
1ce70 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
1ce80 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
1ce90 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
1cea0 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
1ceb0 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
1cec0 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
1ced0 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
1cee0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
1cef0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
1cf00 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
1cf10 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1cf20 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
1cf30 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
1cf40 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
1cf50 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
1cf60 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
1cf70 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
1cf80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1cf90 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
1cfa0 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
1cfb0 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
1cfc0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1cfd0 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
1cfe0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1cff0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1d000 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1d010 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1d020 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
1d030 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
1d040 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
1d050 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1d060 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  rn 0;.}.const vo
1d070 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
1d080 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
1d090 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1d0a0 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
1d0b0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1d0c0 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
1d0d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1d0e0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
1d0f0 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
1d100 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
1d110 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31  ad(pCur, pAmt, 1
1d120 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d130 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  0;.}.../*.** Mov
1d140 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1d150 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
1d160 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
1d170 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
1d180 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
1d190 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
1d1a0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
1d1b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1d1c0 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
1d1d0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
1d1e0 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  ewPgno){.  int r
1d1f0 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75  c;.  int i = pCu
1d200 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50  r->iPage;.  MemP
1d210 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20  age *pNewPage;. 
1d220 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d230 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
1d240 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1d250 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1d260 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1d270 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d280 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1d290 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
1d2a0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
1d2b0 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  H );.  if( pCur-
1d2c0 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
1d2d0 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
1d2e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d2f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d300 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
1d310 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
1d320 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50   newPgno, &pNewP
1d330 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
1d340 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
1d350 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
1d360 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
1d370 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
1d380 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
1d390 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
1d3a0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1d3b0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1d3c0 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
1d3d0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a  age->nCell<1 ){.
1d3e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d3f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1d400 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1d410 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1d420 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
1d430 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
1d440 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
1d450 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
1d460 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1d470 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
1d480 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
1d490 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
1d4a0 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
1d4b0 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
1d4c0 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
1d4d0 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
1d4e0 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
1d4f0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
1d500 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
1d510 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
1d520 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
1d530 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
1d540 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
1d550 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
1d560 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
1d570 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
1d580 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
1d590 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ld){.  assert( i
1d5a0 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx<=pParent->nC
1d5b0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64  ell );.  if( iId
1d5c0 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x==pParent->nCel
1d5d0 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  l ){.    assert(
1d5e0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
1d5f0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
1d600 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
1d610 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65  ==iChild );.  }e
1d620 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
1d630 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1d640 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ll(pParent, iIdx
1d650 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ))==iChild );.  
1d660 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66  }.}.#else.#  def
1d670 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74  ine assertParent
1d680 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65  Index(x,y,z) .#e
1d690 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
1d6a0 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
1d6b0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
1d6c0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
1d6d0 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
1d6e0 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
1d6f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
1d700 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
1d710 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
1d720 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
1d730 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
1d740 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
1d750 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
1d760 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
1d770 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
1d780 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
1d790 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
1d7a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1d7b0 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28  reeMoveToParent(
1d7c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d7d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d7e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d7f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1d800 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1d810 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1d820 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
1d830 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
1d840 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1d850 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1d860 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
1d870 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
1d880 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1d890 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
1d8a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1d8b0 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
1d8c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1d8d0 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
1d8e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1d8f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1d900 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72  >iPage]);.  pCur
1d910 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75  ->iPage--;.  pCu
1d920 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1d930 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
1d940 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  NKey = 0;.}../*.
1d950 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1d960 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  or to the root p
1d970 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  age.*/.static in
1d980 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
1d990 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1d9a0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
1d9b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d9c0 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70  E_OK;.  Btree *p
1d9d0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
1d9e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d9f0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
1da00 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1da10 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1da20 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1da30 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
1da40 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1da50 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1da60 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
1da70 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1da80 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
1da90 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
1daa0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1dab0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1dac0 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
1dad0 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
1dae0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1daf0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
1db00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1db10 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20  pCur->skip;.    
1db20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1db30 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1db40 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
1db50 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
1db60 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1db70 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75   for(i=1; i<=pCu
1db80 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
1db90 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1dba0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
1dbb0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ]);.    }.  }els
1dbc0 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20  e{.    if( .    
1dbd0 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
1dbe0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
1dbf0 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
1dc00 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
1dc10 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b  Page[0])).    ){
1dc20 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
1dc30 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1dc40 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
1dc50 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1dc60 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  ..  pRoot = pCur
1dc70 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
1dc80 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
1dc90 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
1dca0 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ot );.  pCur->iP
1dcb0 61 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  age = 0;.  pCur-
1dcc0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
1dcd0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1dce0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61  e = 0;.  pCur->a
1dcf0 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75  tLast = 0;.  pCu
1dd00 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1dd10 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
1dd20 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
1dd30 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
1dd40 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
1dd50 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
1dd60 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20  >pgno==1 );.    
1dd70 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
1dd80 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
1dd90 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
1dda0 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
1ddb0 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a  t( subpage>0 );.
1ddc0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1ddd0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
1dde0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1ddf0 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
1de00 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
1de10 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1de20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  = ((pRoot->nCell
1de30 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44  >0)?CURSOR_VALID
1de40 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29  :CURSOR_INVALID)
1de50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1de60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
1de70 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1de80 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
1de90 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
1dea0 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
1deb0 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
1dec0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1ded0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
1dee0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
1def0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
1df00 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
1df10 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
1df20 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
1df30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1df40 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
1df50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1df60 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
1df70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1df80 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
1df90 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1dfa0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1dfb0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1dfc0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1dfd0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1dfe0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
1dff0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
1e000 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1e010 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
1e020 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
1e030 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1e040 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1e050 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1e060 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1e070 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1e080 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e, pCur->aiIdx[p
1e090 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20  Cur->iPage]));. 
1e0a0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1e0b0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
1e0c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e0d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1e0e0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
1e0f0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
1e100 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
1e110 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
1e120 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
1e130 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1e140 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
1e150 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
1e160 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
1e170 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
1e180 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
1e190 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
1e1a0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
1e1b0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
1e1c0 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
1e1d0 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
1e1e0 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
1e1f0 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
1e200 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1e210 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
1e220 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
1e230 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
1e240 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
1e250 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
1e260 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
1e270 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
1e280 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1e290 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
1e2a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
1e2b0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
1e2c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e2d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1e2e0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1e2f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1e300 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1e310 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e320 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e330 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
1e340 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
1e350 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1e360 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1e370 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
1e380 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1e390 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1e3a0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1e3b0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  );.    pCur->aiI
1e3c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1e3d0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1e3e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1e3f0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1e400 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1e410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e420 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1e430 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
1e440 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
1e450 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1e460 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
1e470 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1e480 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e490 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1e4a0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
1e4b0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1e4c0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1e4d0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1e4e0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1e4f0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1e500 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1e510 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1e520 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1e530 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1e540 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1e550 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e560 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
1e570 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1e580 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
1e590 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e5a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e5b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1e5c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1e5d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1e5e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1e5f0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1e600 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1e610 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e620 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1e630 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1e640 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1e650 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1e660 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1e670 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
1e680 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1e690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e6a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e6b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1e6c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e6d0 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
1e6e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1e6f0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1e700 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1e710 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e720 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
1e730 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1e740 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1e750 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
1e760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
1e770 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
1e780 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
1e790 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
1e7a0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
1e7b0 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
1e7c0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
1e7d0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1e7e0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1e7f0 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
1e800 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1e810 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1e820 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
1e830 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1e840 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1e850 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1e860 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1e870 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1e880 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
1e890 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
1e8a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e8b0 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
1e8c0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1e8d0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
1e8e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1e8f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e900 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
1e910 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1e920 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e930 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e940 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e950 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
1e960 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1e970 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
1e980 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
1e990 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1e9a0 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  r);.      pCur->
1e9b0 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c  atLast = rc==SQL
1e9c0 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20  ITE_OK ?1:0;.   
1e9d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e9e0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1e9f0 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
1ea00 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
1ea10 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
1ea20 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
1ea30 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
1ea40 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
1ea50 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
1ea60 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
1ea70 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
1ea80 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
1ea90 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
1eaa0 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
1eab0 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
1eac0 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
1ead0 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
1eae0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
1eaf0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
1eb00 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
1eb10 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
1eb20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
1eb30 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
1eb40 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
1eb50 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
1eb60 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
1eb70 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
1eb80 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
1eb90 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
1eba0 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
1ebb0 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
1ebc0 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
1ebd0 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
1ebe0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
1ebf0 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
1ec00 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
1ec10 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
1ec20 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
1ec30 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
1ec40 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
1ec50 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
1ec60 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
1ec70 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
1ec80 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
1ec90 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
1eca0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
1ecb0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1ecc0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1ecd0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1ecf0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
1ed00 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
1ed10 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1ed20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
1ed30 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
1ed40 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
1ed50 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
1ed60 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
1ed70 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
1ed80 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1ed90 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1eda0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1edb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1edc0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
1edd0 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
1ede0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
1edf0 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
1ee00 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
1ee10 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1ee20 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
1ee40 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
1ee50 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
1ee60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ee70 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
1ee80 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1ee90 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
1eea0 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
1eeb0 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
1eec0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
1eed0 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
1eee0 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
1eef0 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
1ef00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ef10 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
1ef20 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
1ef30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1ef40 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
1ef50 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
1ef60 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
1ef70 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
1ef80 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
1ef90 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
1efa0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  /.){.  int rc;..
1efb0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1efc0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1efd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1efe0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1eff0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1f000 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
1f010 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
1f020 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
1f030 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
1f040 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
1f050 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
1f060 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
1f070 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
1f080 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
1f090 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1f0a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
1f0b0 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65  & pCur->validNKe
1f0c0 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61  y .   && pCur->a
1f0d0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
1f0e0 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
1f0f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
1f100 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1f110 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1f120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f130 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
1f140 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26   pCur->atLast &&
1f150 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1f160 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
1f170 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
1f180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f190 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1f1a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
1f1b0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
1f1c0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1f1d0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
1f1e0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1f1f0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1f200 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1f210 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1f220 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  e]->isInit );.  
1f230 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1f240 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1f250 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1f260 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
1f270 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1f280 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1f290 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
1f2a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1f2b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f2c0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
1f2d0 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
1f2e0 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
1f2f0 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20  int lwr, upr;.  
1f300 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
1f310 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1f320 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1f330 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1f340 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20     int c = -1;  
1f350 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20 69  /* pRes return i
1f360 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  f table is empty
1f370 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20   must be -1 */. 
1f380 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
1f390 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
1f3a0 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 28 21  ll-1;.    if( (!
1f3b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1f3c0 20 70 49 64 78 4b 65 79 3d 3d 30 29 20 7c 7c 20   pIdxKey==0) || 
1f3d0 75 70 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  upr<0 ){.      r
1f3e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1f3f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
1f400 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1f410 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  h;.    }.    if(
1f420 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
1f430 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1f440 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
1f450 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c  u16)upr;.    }el
1f460 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  se{.      pCur->
1f470 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1f480 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b  e] = (u16)((upr+
1f490 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  lwr)/2);.    }. 
1f4a0 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
1f4b0 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
1f4c0 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c  ;.      i64 nCel
1f4d0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  lKey;.      int 
1f4e0 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
1f4f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
1f500 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1f510 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1f520 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1f530 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  y = 1;.      if(
1f540 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1f550 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43  {.        u8 *pC
1f560 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
1f570 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1f580 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
1f590 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
1f5a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1f5b0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
1f5c0 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
1f5d0 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
1f5e0 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
1f5f0 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29  32(pCell, dummy)
1f600 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f610 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
1f620 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
1f630 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
1f640 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  f( nCellKey==int
1f650 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1f660 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
1f670 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
1f680 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
1f690 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20         c = -1;. 
1f6a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f6b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f6c0 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
1f6d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
1f6e0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1f6f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f700 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c      int availabl
1f710 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e;.        pCell
1f720 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65  Key = (void *)fe
1f730 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
1f740 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b   &available, 0);
1f750 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65  .        nCellKe
1f760 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
1f770 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
1f780 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c   available>=nCel
1f790 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  lKey ){.        
1f7a0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
1f7b0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 28  eRecordCompare((
1f7c0 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  int)nCellKey, pC
1f7d0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
1f7e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1f7f0 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
1f800 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
1f810 6c 6f 63 28 20 28 69 6e 74 29 6e 43 65 6c 6c 4b  loc( (int)nCellK
1f820 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
1f830 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
1f840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1f850 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1f860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1f870 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1f880 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f890 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f8a0 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75  ite3BtreeKey(pCu
1f8b0 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c  r, 0, (int)nCell
1f8c0 4b 65 79 2c 20 28 76 6f 69 64 2a 29 70 43 65 6c  Key, (void*)pCel
1f8d0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1f8e0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
1f8f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 28 69  RecordCompare((i
1f900 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65  nt)nCellKey, pCe
1f910 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
1f920 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1f930 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
1f940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f950 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
1f960 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
1f970 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f980 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
1f990 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1f9a0 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
1f9b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1f9c0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
1f9d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1f9e0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
1f9f0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70  dx;.          up
1fa00 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20  r = lwr - 1;.   
1fa10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1fa20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fa30 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
1fa40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1fa50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1fa60 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1fa70 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
1fa80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1fa90 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
1faa0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
1fab0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1fac0 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
1fad0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1fae0 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
1faf0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
1fb00 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
1fb10 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Key;.        bre
1fb20 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1fb30 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1fb40 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
1fb50 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b  6)((lwr+upr)/2);
1fb60 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1fb70 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b  t( lwr==upr+1 );
1fb80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1fb90 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1fba0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1fbb0 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  f ){.      chldP
1fbc0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
1fbd0 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
1fbe0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
1fbf0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
1fc00 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1fc10 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1fc20 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
1fc30 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
1fc40 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1fc50 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
1fc60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
1fc70 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ldPg==0 ){.     
1fc80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1fc90 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1fca0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
1fcb0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1fcc0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ll );.      if( 
1fcd0 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63  pRes ) *pRes = c
1fce0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1fcf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
1fd00 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1fd10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
1fd20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1fd30 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
1fd40 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
1fd50 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
1fd60 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1fd70 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
1fd80 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
1fd90 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
1fda0 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f  rc ) goto moveto
1fdb0 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76  _finish;.  }.mov
1fdc0 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65  eto_finish:.  re
1fdd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1fde0 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
1fdf0 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
1fe00 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
1fe10 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
1fe20 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
1fe30 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
1fe40 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1fe50 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
1fe60 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
1fe70 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
1fe80 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
1fe90 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
1fea0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1feb0 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
1fec0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1fed0 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
1fee0 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
1fef0 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
1ff00 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1ff10 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
1ff20 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
1ff30 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
1ff40 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
1ff50 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
1ff60 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
1ff70 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
1ff80 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
1ff90 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
1ffa0 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
1ffb0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
1ffc0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
1ffd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1ffe0 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
1fff0 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
20000 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
20010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
20020 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
20030 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
20040 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
20050 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
20060 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b  /.  char aSpace[
20070 31 35 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  150];          /
20080 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72  * Temp space for
20090 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76   pIdxKey - to av
200a0 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a  oid a malloc */.
200b0 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
200c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
200d0 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
200e0 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
200f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
20100 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
20110 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
20120 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20  Key, pKey,.     
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
20160 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66  aSpace));.    if
20170 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
20180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
20190 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
201a0 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20   pIdxKey = 0;.  
201b0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
201c0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
201d0 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65  ked(pCur, pIdxKe
201e0 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70  y, nKey, bias, p
201f0 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  Res);.  if( pKey
20200 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
20210 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65  dbeDeleteUnpacke
20220 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29  dRecord(pIdxKey)
20230 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20240 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
20250 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
20260 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
20270 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
20280 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
20290 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
202a0 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
202b0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
202c0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
202d0 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
202e0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
202f0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
20300 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
20310 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
20320 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
20330 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
20340 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
20350 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
20360 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20370 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
20380 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
20390 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
203a0 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
203b0 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
203c0 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
203d0 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
203e0 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
203f0 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
20400 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
20410 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
20420 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
20430 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
20440 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
20450 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
20460 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
20470 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
20480 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
20490 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
204a0 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72  dle for a cursor
204b0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
204c0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
204d0 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72 73 6f  Db(const BtCurso
204e0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
204f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
20500 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
20510 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
20520 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
20530 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a  ->pBtree->db;.}.
20540 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
20550 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
20560 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
20570 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
20580 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
20590 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
205a0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
205b0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
205c0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
205d0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
205e0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
205f0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
20600 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
20610 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
20620 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20630 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
20640 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
20650 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
20660 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
20670 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
20680 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20690 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
206a0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
206b0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
206c0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
206d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
206e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
206f0 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
20700 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
20710 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
20720 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
20730 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
20740 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
20750 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
20760 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p>0 ){.    pCur-
20770 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
20780 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
20790 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
207a0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
207b0 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
207c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
207d0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
207e0 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
207f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
20800 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
20810 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
20820 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d  ert( idx<=pPage-
20830 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
20840 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
20850 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
20860 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
20870 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
20880 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
20890 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
208a0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
208b0 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
208c0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
208d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
208e0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
208f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
20900 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
20910 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
20920 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
20930 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
20940 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
20950 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
20960 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
20970 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
20980 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
20990 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
209a0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
209b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
209c0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
209d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
209e0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
209f0 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
20a00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20a10 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77  ->iPage];.    }w
20a20 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
20a30 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
20a40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
20a50 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
20a60 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
20a70 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  tKey ){.      rc
20a80 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
20a90 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
20aa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20ab0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
20ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
20ad0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52  rn rc;.  }.  *pR
20ae0 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  es = 0;.  if( pP
20af0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
20b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20b10 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f  K;.  }.  rc = mo
20b20 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
20b30 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
20b40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  .}.../*.** Step 
20b50 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
20b60 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
20b70 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
20b80 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
20b90 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
20ba0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
20bb0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
20bc0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
20bd0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
20be0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
20bf0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
20c00 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
20c10 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
20c20 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
20c30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20c40 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
20c50 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
20c60 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
20c70 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
20c80 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
20c90 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20ca0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
20cb0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
20cc0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
20cd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20ce0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
20cf0 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
20d00 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66  atLast = 0;.  if
20d10 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
20d20 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
20d30 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
20d40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20d50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
20d60 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b   pCur->skip<0 ){
20d70 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
20d80 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
20d90 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
20da0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
20db0 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
20dc0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
20dd0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20de0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
20df0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
20e00 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
20e10 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
20e20 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
20e30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
20e40 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
20e50 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
20e60 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
20e70 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
20e80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
20e90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
20ea0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
20eb0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
20ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
20ed0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
20ee0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20  pCur->iPage]==0 
20ef0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
20f00 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
20f10 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
20f20 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
20f30 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
20f40 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
20f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20f60 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
20f70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
20f80 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
20f90 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
20fa0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
20fb0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
20fc0 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70  NKey = 0;..    p
20fd0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20fe0 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70  >iPage]--;.    p
20ff0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
21000 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21010 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
21020 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
21030 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
21040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21050 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
21060 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
21070 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
21080 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
21090 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
210a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
210b0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
210c0 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
210d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
210e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
210f0 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
21100 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
21110 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
21120 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
21130 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
21140 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
21150 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
21160 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
21170 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
21180 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
21190 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
211a0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
211b0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
211c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
211d0 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
211e0 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
211f0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
21200 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
21210 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
21220 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
21230 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
21240 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
21250 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20   and *pPgno are 
21260 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  undefined in the
21270 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
21280 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e  or..** Do not in
21290 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65  voke sqlite3Page
212a0 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50  rUnref() on *ppP
212b0 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  age if an error 
212c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
212d0 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
212e0 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
212f0 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66  not 0, then a (f
21300 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73  eeble) effort is
21310 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
21320 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
21330 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
21340 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
21350 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
21360 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
21370 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
21380 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
21390 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
213a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
213b0 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
213c0 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
213d0 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
213e0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
213f0 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65  "exact" paramete
21400 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20  r is not 0, and 
21410 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
21420 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a  nearby exists .*
21430 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
21440 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
21450 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65  n it is guarente
21460 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
21470 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  d. This.** is on
21480 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  ly used by auto-
21490 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
214a0 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
214b0 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f   a new table..*/
214c0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
214d0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
214e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
214f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
21500 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50  age, .  Pgno *pP
21510 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61  gno, .  Pgno nea
21520 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a  rby,.  u8 exact.
21530 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
21540 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
21550 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20    int n;     /* 
21560 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
21570 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
21580 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20  */.  int k;     
21590 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
215a0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
215b0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
215c0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
215d0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
215e0 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
215f0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
21600 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
21610 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
21620 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
21630 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d  t->pPage1;.  n =
21640 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
21650 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
21660 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
21670 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
21680 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
21690 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
216a0 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
216b0 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
216c0 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
216d0 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
216e0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
216f0 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
21700 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
21710 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68     .    /* If th
21720 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65  e 'exact' parame
21730 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64  ter was true and
21740 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
21750 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
21760 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
21770 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
21780 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
21790 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
217a0 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
217b0 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
217c0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
217d0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
217e0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
217f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21800 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26  .    if( exact &
21810 26 20 6e 65 61 72 62 79 3c 3d 70 61 67 65 72 50  & nearby<=pagerP
21820 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
21830 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
21840 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
21850 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
21860 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
21870 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
21880 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
21890 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
218a0 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
218b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
218c0 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
218d0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
218e0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
218f0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
21900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
21910 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
21920 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
21930 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
21940 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
21950 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
21960 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
21970 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
21980 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
21990 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
219a0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
219b0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
219c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
219d0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
219e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
219f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
21a00 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
21a10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
21a20 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
21a30 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
21a40 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
21a50 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
21a60 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
21a70 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
21a80 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
21a90 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
21aa0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
21ab0 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
21ac0 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
21ad0 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
21ae0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
21af0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
21b00 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
21b10 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
21b20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
21b30 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
21b40 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
21b50 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
21b60 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
21b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
21b80 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
21b90 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
21ba0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
21bb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
21bc0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
21bd0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
21be0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
21bf0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
21c00 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
21c10 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
21c20 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
21c30 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  }..      k = get
21c40 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
21c50 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
21c60 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
21c70 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
21c80 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
21c90 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
21ca0 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
21cb0 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
21cc0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
21cd0 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
21ce0 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
21cf0 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
21d00 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
21d10 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
21d20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
21d30 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
21d40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
21d50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
21d60 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
21d70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
21d80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
21d90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
21da0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
21db0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
21dc0 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
21dd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
21de0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
21df0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
21e00 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
21e10 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
21e20 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
21e30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
21e40 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
21e50 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
21e60 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
21e70 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
21e80 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21e90 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   k>pBt->usableSi
21ea0 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
21eb0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
21ec0 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  k is out of rang
21ed0 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  e.  Database cor
21ee0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
21ef0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
21f00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
21f10 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
21f20 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
21f30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21f40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
21f50 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
21f60 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79  chList && nearby
21f70 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  ==iTrunk ){.    
21f80 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
21f90 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
21fa0 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
21fb0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
21fc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
21fd0 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
21fe0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
21ff0 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
22000 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22010 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
22020 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20  ==iTrunk );.    
22030 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
22040 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
22050 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
22060 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22070 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
22080 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
22090 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
220a0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
220b0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
220c0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
220d0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
220e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
220f0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
22100 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
22110 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
22120 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
22130 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
22140 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22150 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
22160 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
22170 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
22180 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
22190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
221a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
221b0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
221c0 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
221d0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
221e0 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
221f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
22200 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
22210 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
22220 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
22230 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
22240 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
22250 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
22260 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
22270 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
22280 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
22290 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
222a0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
222b0 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
222c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
222d0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
222e0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
222f0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
22300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
22310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22320 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
22330 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
22340 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
22350 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
22360 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
22370 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
22380 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
22390 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
223a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
223b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
223c0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
223d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
223e0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
223f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22400 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
22410 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
22420 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
22430 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
22440 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
22450 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
22460 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
22470 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
22480 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
22490 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
224a0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
224b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
224c0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
224d0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
224e0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
224f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
22500 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
22510 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
22520 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
22530 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
22540 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
22550 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
22560 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22570 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
22580 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
22590 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
225a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
225b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
225c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
225d0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
225e0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
225f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
22600 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
22610 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
22620 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
22630 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22640 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
22650 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
22660 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
22670 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
22680 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
22690 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
226a0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
226b0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  e{.        /* Ex
226c0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
226d0 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
226e0 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65         int close
226f0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
22700 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
22710 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
22720 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
22730 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63  Data;.        rc
22740 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
22750 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
22760 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
22770 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
22780 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
22790 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
227a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
227b0 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
227c0 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69         int i, di
227d0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
227e0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
227f0 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34       dist = get4
22800 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
22810 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
22820 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29      if( dist<0 )
22830 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20   dist = -dist;. 
22840 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
22850 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
22860 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
22870 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
22880 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
22890 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  by;.            
228a0 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20  if( d2<0 ) d2 = 
228b0 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -d2;.           
228c0 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
228e0 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
228f0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
22900 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
22910 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
22920 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22930 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
22940 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
22950 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
22960 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
22970 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
22980 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
22990 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d  hList || iPage==
229a0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
229b0 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
229c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  t;.          Pgn
229d0 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o nPage;.       
229e0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
229f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61  e;.          nPa
22a00 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
22a10 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  unt(pBt);.      
22a20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e      if( *pPgno>n
22a30 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
22a40 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65      /* Free page
22a50 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
22a60 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
22a70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22a80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22a90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
22aa0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
22ab0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
22ac0 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  }.          TRAC
22ad0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
22ae0 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
22af0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b10 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
22b20 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
22b30 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
22b40 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
22b50 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
22b60 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
22b70 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
22b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22b90 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
22ba0 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
22bb0 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
22bc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22bd0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
22be0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
22bf0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22c00 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
22c10 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d  riteable(pTrunk-
22c20 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
22c30 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
22c40 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
22c50 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
22c60 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
22c70 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22c80 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
22c90 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
22ca0 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
22cb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22cc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22cd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22ce0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
22cf0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
22d00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22d10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
22d30 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
22d40 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
22d50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
22d60 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
22d70 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
22d80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
22d90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
22da0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
22db0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
22dc0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
22dd0 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
22de0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
22df0 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
22e00 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
22e10 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
22e20 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a  ge at the.    **
22e30 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
22e40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
22e50 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
22e60 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50  nt(pBt);.    *pP
22e70 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b  gno = nPage + 1;
22e80 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f  ..    if( *pPgno
22e90 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
22ea0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
22eb0 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
22ec0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
22ed0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
22ee0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
22ef0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
22f00 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
22f10 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20  , *pPgno) ){.   
22f20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
22f30 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
22f40 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
22f50 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
22f60 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
22f70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
22f80 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
22f90 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
22fa0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
22fb0 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
22fc0 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
22fd0 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
22fe0 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
22ff0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
23000 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
23010 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  *pPg = 0;.      
23020 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
23030 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
23040 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
23050 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50  ap page)\n", *pP
23060 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73  gno));.      ass
23070 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
23080 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
23090 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
230a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
230b0 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
230c0 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  o, &pPg, 0);.   
230d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
230e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
230f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23100 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
23110 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
23120 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
23130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23140 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
23150 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  ;.      (*pPgno)
23160 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  ++;.      if( *p
23170 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
23180 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
23190 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20  (*pPgno)++; }.  
231a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
231b0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
231c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
231d0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
231e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
231f0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
23200 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
23210 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
23220 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
23230 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23240 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
23250 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
23260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23270 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
23280 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
23290 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
232a0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
232b0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
232c0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
232d0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
232e0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
232f0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
23300 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
23310 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
23320 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
23330 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
23340 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
23350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
23360 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
23370 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
23380 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
23390 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
233a0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
233b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
233c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
233d0 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
233e0 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
233f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23400 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
23410 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
23420 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
23430 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
23440 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
23450 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
23460 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
23470 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
23480 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
23490 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
234a0 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
234b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
234c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
234d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
234e0 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
234f0 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
23500 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
23510 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
23520 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
23530 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
23540 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
23550 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
23560 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
23570 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
23580 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
23590 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
235a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
235b0 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
235c0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
235d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
235e0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
235f0 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
23600 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
23610 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
23620 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
23630 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
23640 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
23650 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
23660 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
23670 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
23680 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
23690 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
236a0 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
236d0 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
236e0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
236f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
23700 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
23710 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
23720 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
23730 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
23740 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
23750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23760 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
23770 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
23780 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
23790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
237b0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
237c0 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
237e0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
237f0 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
23800 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
23810 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
23820 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
23830 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
23840 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
23850 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
23860 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
23870 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
23880 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
23890 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
238a0 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
238b0 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
238c0 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
238d0 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
238e0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
238f0 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
23900 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
23910 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
23920 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
23930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23940 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
23950 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
23960 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
23970 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
23980 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
23990 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
239a0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
239b0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
239c0 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66 64 65  nFree+1);..#ifde
239d0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
239e0 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
239f0 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
23a00 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
23a10 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
23a20 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
23a30 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
23a40 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
23a50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
23a60 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
23a70 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
23a80 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23a90 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
23aa0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
23ab0 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20  ).   ||         
23ac0 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33     (rc = sqlite3
23ad0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
23ae0 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20 29 7b  ->pDbPage)).  ){
23af0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
23b00 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d 65  ge_out;.  }.  me
23b10 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
23b20 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
23b30 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e  ->pageSize);.#en
23b40 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
23b50 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
23b60 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
23b70 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
23b80 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
23b90 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
23ba0 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
23bb0 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
23bc0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
23bd0 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  M ){.    rc = pt
23be0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
23bf0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
23c00 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
23c10 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
23c20 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
23c30 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
23c40 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
23c50 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
23c60 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
23c70 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
23c80 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
23c90 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
23ca0 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
23cb0 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
23cc0 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
23cd0 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
23ce0 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
23cf0 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
23d00 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
23d10 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
23d20 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
23d30 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
23d40 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
23d50 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
23d60 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
23d70 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
23d80 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
23d90 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
23da0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
23db0 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
23dc0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
23dd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
23de0 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
23df0 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
23e00 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
23e10 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
23e20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
23e30 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
23e40 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
23e50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
23e60 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
23e70 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
23e80 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
23e90 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
23ea0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23eb0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
23ec0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
23ed0 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
23ee0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
23ef0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
23f00 69 66 28 20 6e 4c 65 61 66 3c 30 20 29 7b 0a 20  if( nLeaf<0 ){. 
23f10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23f20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
23f30 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
23f40 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
23f50 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42 74 2d    if( nLeaf<pBt-
23f60 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
23f70 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
23f80 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
23f90 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
23fa0 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
23fb0 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
23fc0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
23fd0 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
23fe0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
23ff0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
24000 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
24010 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
24020 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
24030 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
24040 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
24050 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
24060 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
24070 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
24080 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
24090 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
240a0 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
240b0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
240c0 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
240d0 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
240e0 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
240f0 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
24100 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
24110 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
24120 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
24130 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
24140 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
24150 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
24160 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
24170 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
24180 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
24190 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
241a0 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
241b0 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65  ll contain to re
241c0 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
241d0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
241e0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
241f0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
24200 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
24210 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
24220 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
24230 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
24240 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
24250 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
24260 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
24270 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
24280 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
24290 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
242a0 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
242b0 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
242c0 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  /4-8"..      */.
242d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
242e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
242f0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
24300 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24320 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
24330 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
24340 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
24350 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
24360 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
24370 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e  4], iPage);.#ifn
24380 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
24390 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
243a0 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
243b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
243c0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
243d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
243e0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
243f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
24400 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
24410 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  pBt, iPage);.   
24420 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
24430 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
24440 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
24450 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
24460 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
24470 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  no));.      goto
24480 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
24490 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
244a0 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20  f control flows 
244b0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
244c0 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70  hen it was not p
244d0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
244e0 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  he.  ** the page
244f0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
24500 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74  a leaf page of t
24510 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  he first trunk i
24520 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
24530 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62  .  ** Possibly b
24540 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d  ecause the free-
24550 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f  list is empty, o
24560 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75  r possibly becau
24570 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72  se the .  ** fir
24580 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
24590 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
245a0 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  l. Either way, t
245b0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
245c0 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  eed.  ** will be
245d0 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72  come the new fir
245e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
245f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
24600 20 20 2a 2f 0a 20 20 69 66 28 20 20 20 28 28 21    */.  if(   ((!
24610 70 50 61 67 65 29 20 26 26 20 28 30 20 21 3d 20  pPage) && (0 != 
24620 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
24630 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
24640 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
24650 29 29 29 0a 20 20 20 20 20 7c 7c 20 28 30 20 21  ))).     || (0 !
24660 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  = (rc = sqlite3P
24670 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
24680 3e 70 44 62 50 61 67 65 29 29 29 0a 20 20 29 7b  >pDbPage))).  ){
24690 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
246a0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
246b0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
246c0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
246d0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
246e0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
246f0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
24700 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
24710 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
24720 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
24730 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
24740 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
24750 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
24760 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
24770 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
24780 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
24790 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
247a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
247b0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
247c0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
247d0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
247e0 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65   int freePage(Me
247f0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
24800 20 72 65 74 75 72 6e 20 66 72 65 65 50 61 67 65   return freePage
24810 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
24820 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
24830 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
24840 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
24850 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
24860 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
24870 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
24880 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
24890 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
248a0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
248b0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
248c0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
248d0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
248e0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
248f0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
24900 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20  nt nOvfl;.  u16 
24910 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
24920 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24930 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
24940 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
24950 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
24960 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
24970 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
24980 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
24990 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
249a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
249b0 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
249c0 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
249d0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
249e0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
249f0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
24a00 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
24a10 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
24a20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
24a30 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
24a40 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
24a50 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
24a60 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
24a70 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
24a80 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
24a90 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
24aa0 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
24ab0 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e   assert( ovflPgn
24ac0 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20  o==0 || nOvfl>0 
24ad0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
24ae0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
24af0 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
24b00 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
24b10 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
24b20 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
24b30 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
24b40 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
24b50 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
24b60 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
24b70 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
24b80 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
24b90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
24ba0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
24bb0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
24bc0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
24bd0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
24be0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
24bf0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
24c00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24c10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24c20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
24c30 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
24c40 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
24c50 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
24c60 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
24c70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
24c80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
24c90 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65   }.    rc = free
24ca0 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
24cb0 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
24cc0 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
24cd0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
24ce0 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
24cf0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
24d00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
24d10 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
24d20 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
24d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24d40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
24d50 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
24d60 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
24d70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
24d80 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
24d90 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
24da0 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
24db0 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
24dc0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
24dd0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
24de0 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
24df0 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
24e00 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
24e10 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
24e20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
24e30 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
24e40 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
24e50 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
24e60 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
24e70 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
24e80 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
24e90 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
24ea0 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
24eb0 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
24ec0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
24ed0 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
24ee0 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
24ef0 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
24f00 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
24f10 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
24f20 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
24f30 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
24f40 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
24f50 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
24f60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24f70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24f80 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
24f90 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
24fa0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
24fb0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
24fc0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
24fd0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
24fe0 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
24ff0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
25000 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
25010 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  key */.  const v
25020 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e  oid *pData,int n
25030 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64  Data,   /* The d
25040 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ata */.  int nZe
25050 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
25060 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
25070 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61   zero bytes to a
25080 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a  ppend to pData *
25090 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
250c0 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
250d0 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
250e0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
250f0 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
25100 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63  , rc;.  int spac
25110 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
25120 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d   *pOvfl = 0;.  M
25130 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
25140 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  se = 0;.  unsign
25150 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
25160 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
25170 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
25180 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
25190 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
251a0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
251b0 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20   int nHeader;.  
251c0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
251d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
251e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
251f0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
25200 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
25210 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
25220 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
25230 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
25240 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
25250 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
25260 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
25270 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
25280 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
25290 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
252a0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
252b0 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
252c0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
252d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
252e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
252f0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
25300 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
25310 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
25320 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
25330 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61   = 0;.  if( !pPa
25340 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
25350 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20  nHeader += 4;.  
25360 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  }.  if( pPage->h
25370 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48  asData ){.    nH
25380 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
25390 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
253a0 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  r], nData+nZero)
253b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
253c0 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30  Data = nZero = 0
253d0 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
253e0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
253f0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
25400 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73  u64*)&nKey);.  s
25410 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
25420 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
25430 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
25440 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
25450 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
25460 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
25470 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
25480 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
25490 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
254a0 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
254b0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
254c0 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
254d0 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
254e0 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
254f0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
25500 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
25510 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
25520 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
25530 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
25540 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66   nKey>0x7fffffff
25550 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20   || pKey==0 ){. 
25560 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25570 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
25580 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  }.    nPayload +
25590 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
255a0 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
255b0 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
255c0 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
255d0 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
255e0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
255f0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
25600 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
25610 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
25620 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
25630 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
25640 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
25650 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
25660 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
25670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25680 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
25690 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
256a0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
256b0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
256c0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
256d0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
256e0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
256f0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
25700 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
25710 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
25720 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
25730 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
25740 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
25750 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
25760 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
25770 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
25780 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25790 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
257a0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
257b0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
257c0 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
257d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
257e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
257f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
25800 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
25810 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
25820 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
25830 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
25840 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
25850 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
25860 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
25870 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
25880 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
25890 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
258a0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
258b0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
258c0 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
258d0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
258e0 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
258f0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
25900 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
25910 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
25920 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
25930 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
25940 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
25950 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
25960 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
25970 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
25980 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
25990 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
259a0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
259b0 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
259c0 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
259d0 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
259e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
259f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25a00 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
25a10 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
25a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25a30 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
25a40 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
25a50 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
25a60 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
25a70 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
25a80 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
25a90 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
25aa0 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  map);.        if
25ab0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
25ac0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
25ad0 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
25ae0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25af0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
25b00 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
25b10 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
25b20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
25b30 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
25b40 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
25b50 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
25b60 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
25b70 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
25b80 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
25b90 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
25ba0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
25bb0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
25bc0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
25bd0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
25be0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
25bf0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
25c00 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
25c10 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
25c20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
25c30 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
25c40 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
25c50 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
25c60 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
25c70 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
25c80 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
25c90 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
25ca0 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
25cb0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
25cc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
25cd0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
25ce0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25cf0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
25d00 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
25d10 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
25d20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
25d30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
25d40 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
25d50 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
25d60 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
25d70 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
25d80 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
25d90 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
25da0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
25db0 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
25dc0 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
25dd0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
25de0 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
25df0 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
25e00 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
25e10 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
25e20 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
25e30 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
25e40 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
25e50 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
25e60 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
25e70 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
25e80 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
25e90 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
25ea0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
25eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
25ec0 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
25ed0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25ee0 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
25ef0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
25f00 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
25f10 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
25f20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
25f30 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
25f40 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
25f50 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
25f60 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
25f70 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
25f80 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
25f90 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
25fa0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
25fb0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
25fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
25fd0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
25fe0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
25ff0 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
26000 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
26010 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
26020 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
26030 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
26040 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
26050 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26060 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
26070 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
26080 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
26090 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
260a0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
260b0 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
260c0 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
260d0 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
260e0 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
260f0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
26100 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
26110 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
26120 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
26130 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
26140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26150 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
26160 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
26170 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
26180 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
26190 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
261a0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
261b0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
261c0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
261d0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
261e0 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
261f0 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
26200 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
26210 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
26220 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
26230 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
26240 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
26250 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
26260 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
26270 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
26280 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
26290 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65 6c  atic int dropCel
262a0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
262b0 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
262c0 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
262d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
262e0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
262f0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
26300 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
26310 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
26320 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
26330 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
26340 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
26350 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
26360 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
26370 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
26380 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
26390 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
263a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
263b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
263c0 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
263d0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
263e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
263f0 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
26400 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
26410 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
26420 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
26430 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
26440 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26450 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
26460 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
26470 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
26480 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
26490 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
264a0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78  llOffset + 2*idx
264b0 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
264c0 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20 28  te(ptr);.  if( (
264d0 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  pc<pPage->hdrOff
264e0 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
264f0 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c  af?0:4)).     ||
26500 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70   (pc+sz>pPage->p
26510 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20  Bt->usableSize) 
26520 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26530 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
26540 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  T;.  }.  rc = fr
26550 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
26560 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
26570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26580 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26590 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b  }.  for(i=idx+1;
265a0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
265b0 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20   i++, ptr+=2){. 
265c0 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
265d0 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d  2];.    ptr[1] =
265e0 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70   ptr[3];.  }.  p
265f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
26600 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
26610 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
26620 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
26630 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
26640 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72  ee += 2;.  retur
26650 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26660 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
26670 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
26680 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
26690 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
266a0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
266b0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
266c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
266d0 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
266e0 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
266f0 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
26700 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
26710 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
26720 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
26730 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
26740 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
26750 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
26760 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
26770 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
26780 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
26790 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
267a0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
267b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
267c0 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
267d0 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
267e0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
267f0 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
26800 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
26810 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
26820 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
26830 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
26840 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
26850 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
26860 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
26870 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
26880 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
26890 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
268a0 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
268b0 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
268c0 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
268d0 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
268e0 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
268f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
26900 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
26910 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
26920 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
26930 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
26940 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
26950 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
26960 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
26970 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
26980 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  int insertCell(.
26990 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
269a0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
269b0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
269c0 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
269d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
269e0 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
269f0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
26a00 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
26a10 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
26a20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
26a30 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
26a40 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
26a50 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
26a60 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
26a70 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
26a80 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
26a90 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
26aa0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
26ab0 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70  ed */.  u8 nSkip
26ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
26ad0 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69  not write the fi
26ae0 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
26af0 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  of the cell */.)
26b00 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  {.  int idx;    
26b10 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
26b20 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
26b30 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
26b40 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
26b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
26b60 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
26b70 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
26b80 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
26b90 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  f content for an
26ba0 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d  y cell in data[]
26bb0 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
26bc0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
26bd0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
26be0 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
26bf0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
26c00 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
26c10 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
26c20 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
26c30 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
26c40 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
26c50 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
26c60 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61  * Offset into da
26c70 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65  ta[] of the page
26c80 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
26c90 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
26ca0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
26cb0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
26cc0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
26cd0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
26ce0 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
26cf0 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
26d00 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
26d10 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
26d20 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
26d30 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
26d40 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
26d50 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
26d60 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
26d70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
26d80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
26d90 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
26da0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
26db0 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
26dc0 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20  >pBt)<=5460 );. 
26dd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
26de0 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
26df0 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66  Size(pPage->aOvf
26e00 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
26e10 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
26e20 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b  pPage, pCell) );
26e30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26e40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
26e50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
26e60 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
26e70 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
26e80 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
26e90 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
26ea0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
26eb0 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
26ec0 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
26ed0 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
26ee0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
26ef0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
26f00 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
26f10 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
26f20 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
26f30 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
26f40 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29  ge->aOvfl[0])) )
26f50 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
26f60 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
26f70 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
26f80 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28  aOvfl[j].idx = (
26f90 75 31 36 29 69 3b 0a 20 20 20 20 70 50 61 67 65  u16)i;.    pPage
26fa0 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
26fb0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
26fc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26fd0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
26fe0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
26ff0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27000 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
27010 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
27020 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
27030 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
27040 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
27050 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
27060 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20  Data;.    hdr = 
27070 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
27080 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
27090 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
270a0 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ]);.    cellOffs
270b0 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
270c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
270d0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
270e0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20  *pPage->nCell + 
270f0 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  2;.    ins = cel
27100 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
27110 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70     if( end > top
27120 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72   - sz ){.      r
27130 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
27140 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
27150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27160 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
27170 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
27180 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74  .      top = get
27190 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
271a0 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  5]);.      asser
271b0 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74  t( end + sz <= t
271c0 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op );.    }.    
271d0 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  idx = allocateSp
271e0 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a  ace(pPage, sz);.
271f0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e      assert( idx>
27200 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27210 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65   end <= get2byte
27220 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
27230 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b 73 7a  ;.    if (idx+sz
27240 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
27250 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20 20  sableSize) {.   
27260 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27270 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
27280 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
27290 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
272a0 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a  ge->nFree -= 2;.
272b0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
272c0 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
272d0 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
272e0 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65  ip);.    for(j=e
272f0 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b  nd-2, ptr=&data[
27300 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
27310 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
27320 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
27330 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
27340 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
27350 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
27360 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
27370 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
27380 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
27390 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  >nCell);.#ifndef
273a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
273b0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
273c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
273d0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
273e0 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
273f0 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
27400 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
27410 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
27420 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
27430 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
27440 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
27450 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
27460 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
27470 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
27480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
27490 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
274a0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
274b0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nfo);.      asse
274c0 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
274d0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
274e0 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
274f0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
27500 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
27510 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
27520 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
27530 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
27540 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
27550 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  w]);.        rc 
27560 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  = ptrmapPut(pPag
27570 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  e->pBt, pgnoOvfl
27580 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
27590 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
275a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
275b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
275c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
275d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
275e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
275f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27600 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
27610 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
27620 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
27630 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
27640 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
27650 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
27660 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
27670 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
27680 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
27690 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
276a0 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
276b0 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
276c0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
276d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
276e0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
276f0 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
27700 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
27710 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
27720 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
27730 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a  odies */.  u16 *
27740 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
27750 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
27760 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
27770 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
27780 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
27790 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b    int totalSize;
277a0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
277b0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
277c0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
277d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
277e0 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
277f0 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20  .  int cellptr; 
27800 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
27810 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
27820 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
27830 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
27840 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
27850 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
27860 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
27870 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  /* Data for the 
27880 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
27890 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
278a0 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
278b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
278c0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
278d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
278e0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20  ssert( nCell>=0 
278f0 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  && nCell<=MX_CEL
27900 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
27910 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
27920 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20  pBt)<=5460 );.  
27930 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20  totalSize = 0;. 
27940 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
27950 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74  l; i++){.    tot
27960 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b  alSize += aSize[
27970 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
27980 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43  ( totalSize+2*nC
27990 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ell<=pPage->nFre
279a0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
279b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
279c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
279d0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
279e0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
279f0 67 65 29 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72  ge) );.  cellptr
27a00 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
27a10 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
27a20 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
27a30 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
27a40 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74  ffset;.  put2byt
27a50 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
27a60 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43  nCell);.  if( nC
27a70 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62  ell ){.    cellb
27a80 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  ody = allocateSp
27a90 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c  ace(pPage, total
27aa0 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Size);.    asser
27ab0 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b  t( cellbody>0 );
27ac0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27ad0 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e  ge->nFree >= 2*n
27ae0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  Cell );.    pPag
27af0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43  e->nFree -= 2*nC
27b00 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ell;.    for(i=0
27b10 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
27b20 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
27b30 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20  &data[cellptr], 
27b40 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20  cellbody);.     
27b50 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65   memcpy(&data[ce
27b60 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b  llbody], apCell[
27b70 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20  i], aSize[i]);. 
27b80 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20       cellptr += 
27b90 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64  2;.      cellbod
27ba0 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y += aSize[i];. 
27bb0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
27bc0 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65   cellbody==pPage
27bd0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
27be0 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  e );.  }.  pPage
27bf0 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e  ->nCell = (u16)n
27c00 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
27c10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
27c20 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
27c30 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
27c40 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
27c50 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
27c60 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
27c70 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
27c80 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
27c90 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
27ca0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
27cb0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
27cc0 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
27cd0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
27ce0 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
27cf0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
27d00 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
27d10 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
27d20 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
27d30 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
27d40 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
27d50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
27d60 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
27d70 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
27d80 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
27d90 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
27da0 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
27db0 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
27dc0 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
27dd0 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
27de0 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
27df0 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
27e00 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
27e10 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
27e20 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
27e30 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
27e40 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
27e50 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
27e60 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
27e70 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
27e80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27e90 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
27ea0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
27eb0 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
27ec0 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
27ed0 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
27ee0 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
27ef0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20   balance */../* 
27f00 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
27f10 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
27f20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72  balance(BtCursor
27f30 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65  *, int);..#ifnde
27f40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
27f50 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
27f60 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
27f70 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
27f80 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
27f90 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
27fa0 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
27fb0 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
27fc0 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
27fd0 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
27fe0 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
27ff0 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
28000 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
28010 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
28020 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
28030 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
28040 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
28050 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ing balance the 
28060 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
28070 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
28080 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
28090 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
280a0 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
280b0 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
280c0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
280d0 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
280e0 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
280f0 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
28100 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
28110 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
28120 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
28130 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
28140 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
28150 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
28160 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
28170 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
28180 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
28190 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
281a0 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
281b0 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
281c0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
281d0 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
281e0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
281f0 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
28200 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
28210 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
28220 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
28230 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
28240 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
28250 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
28260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
28270 6c 61 6e 63 65 5f 71 75 69 63 6b 28 42 74 43 75  lance_quick(BtCu
28280 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
28290 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
282a0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 50 67   *pNew = 0;.  Pg
282b0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38  no pgnoNew;.  u8
282c0 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73   *pCell;.  u16 s
282d0 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66  zCell;.  CellInf
282e0 6f 20 69 6e 66 6f 3b 0a 20 20 4d 65 6d 50 61 67  o info;.  MemPag
282f0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
28300 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28310 61 67 65 5d 3b 0a 20 20 4d 65 6d 50 61 67 65 20  age];.  MemPage 
28320 2a 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d  *pParent = pCur-
28330 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28340 61 67 65 2d 31 5d 3b 0a 20 20 42 74 53 68 61 72  age-1];.  BtShar
28350 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
28360 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65  >pBt;.  int pare
28370 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d  ntIdx = pParent-
28380 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61  >nCell;   /* pPa
28390 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72  rent new divider
283a0 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
283b0 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b   int parentSize;
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283d0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65     /* Size of ne
283e0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
283f0 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c  /.  u8 parentCel
28400 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20  l[64];          
28410 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
28420 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  or the new divid
28430 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73  er cell */..  as
28440 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
28450 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
28460 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
28470 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
28480 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74  new page. Insert
28490 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
284a0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20  ll from pPage.  
284b0 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e  ** into it. Then
284c0 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72   remove the over
284d0 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
284e0 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  Page..  */.  rc 
284f0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
28500 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
28510 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
28520 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 65 6c  E_OK ){.    pCel
28540 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
28550 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 73  [0].pCell;.    s
28560 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
28570 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
28580 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
28590 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
285a0 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62  teable(pNew->pDb
285b0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72  Page) );.    zer
285c0 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67  oPage(pNew, pPag
285d0 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  e->aData[0]);.  
285e0 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
285f0 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
28600 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50  &szCell);.    pP
28610 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
28620 20 30 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 70 50   0;.  .    /* pP
28630 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
28640 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
28650 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
28660 6e 67 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  nge this.    ** 
28670 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68  so that the righ
28680 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e  t-child is the n
28690 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65  ew page allocate
286a0 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 20 20  d above and.    
286b0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
286c0 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
286d0 69 6c 64 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ild. .    **.   
286e0 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72   ** Ignore the r
286f0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
28700 68 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49  he call to fillI
28710 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43  nCell(). fillInC
28720 65 6c 6c 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ell().    ** may
28730 20 6f 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68   only return oth
28740 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
28750 4b 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69  K if it is requi
28760 72 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  red to allocate.
28770 20 20 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f      ** one or mo
28780 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
28790 73 2e 20 53 69 6e 63 65 20 61 6e 20 69 6e 74 65  s. Since an inte
287a0 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d 54 72 65  rnal table B-Tre
287b0 65 20 63 65 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d  e cell .    ** m
287c0 61 79 20 6e 65 76 65 72 20 73 70 69 6c 6c 20 6f  ay never spill o
287d0 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72  ver onto an over
287e0 66 6c 6f 77 20 70 61 67 65 20 28 69 74 20 69 73  flow page (it is
287f0 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 20   a maximum of . 
28800 20 20 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69     ** 13 bytes i
28810 6e 20 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e  n size), it is n
28820 6f 74 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f  ot neccessary to
28830 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
28840 6e 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  n code..    **. 
28850 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
28860 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
28870 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  ) function canno
28880 74 20 66 61 69 6c 20 69 66 20 74 68 65 20 70 61  t fail if the pa
28890 67 65 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  ge.    ** being 
288a0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73  inserted into is
288b0 20 61 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c   already writabl
288c0 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64  e and the cell d
288d0 6f 65 73 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  oes not .    ** 
288e0 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66  contain an overf
288f0 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20  low pointer. So 
28900 69 67 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75  ignore this retu
28910 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 20  rn code too..   
28920 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28930 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
28940 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ;.    pCell = fi
28950 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
28960 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
28970 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
28980 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
28990 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
289a0 3b 0a 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c  ;.    fillInCell
289b0 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
289c0 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
289d0 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61  ey, 0, 0, 0, &pa
289e0 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 61  rentSize);.    a
289f0 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a  ssert( parentSiz
28a00 65 3c 36 34 20 29 3b 0a 20 20 20 20 61 73 73 65  e<64 );.    asse
28a10 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
28a20 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
28a30 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
28a40 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
28a50 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49  pParent, parentI
28a60 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20  dx, parentCell, 
28a70 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34  parentSize, 0, 4
28a80 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
28a90 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
28aa0 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49  (pParent,parentI
28ab0 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  dx), pPage->pgno
28ac0 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
28ad0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
28ae0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
28af0 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
28b00 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
28b10 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
28b20 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
28b30 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
28b40 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74  r map.    ** wit
28b50 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
28b60 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
28b70 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
28b80 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c   the .    ** cel
28b90 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
28ba0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
28bb0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
28bc0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
28bd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
28be0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
28bf0 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
28c00 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
28c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
28c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28c30 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
28c40 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30  pPutOvfl(pNew, 0
28c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28c60 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
28c70 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
28c80 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
28c90 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  */.    releasePa
28ca0 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ge(pNew);.  }.. 
28cb0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
28cc0 74 20 74 68 65 20 70 50 61 67 65 2d 3e 6e 46 72  t the pPage->nFr
28cd0 65 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e  ee variable is n
28ce0 6f 74 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  ot set correctly
28cf0 20 77 69 74 68 0a 20 20 2a 2a 20 72 65 73 70 65   with.  ** respe
28d00 63 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ct to the conten
28d10 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 28 62  t of the page (b
28d20 65 63 61 75 73 65 20 69 74 20 77 61 73 20 73 65  ecause it was se
28d30 74 20 74 6f 20 30 20 62 79 20 0a 20 20 2a 2a 20  t to 0 by .  ** 
28d40 69 6e 73 65 72 74 43 65 6c 6c 29 2e 20 53 6f 20  insertCell). So 
28d50 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65  call sqlite3Btre
28d60 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f 20 6d  eInitPage() to m
28d70 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 0a 20  ake sure it is. 
28d80 20 2a 2a 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   ** correct..  *
28d90 2a 0a 20 20 2a 2a 20 54 68 69 73 20 68 61 73 20  *.  ** This has 
28da0 74 6f 20 62 65 20 64 6f 6e 65 20 65 76 65 6e 20  to be done even 
28db0 69 66 20 61 6e 20 65 72 72 6f 72 20 77 69 6c 6c  if an error will
28dc0 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 4e 6f   be returned. No
28dd0 72 6d 61 6c 6c 79 2c 20 69 66 0a 20 20 2a 2a 20  rmally, if.  ** 
28de0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
28df0 64 75 72 69 6e 67 20 74 72 65 65 20 62 61 6c 61  during tree bala
28e00 6e 63 69 6e 67 2c 20 74 68 65 20 63 6f 6e 74 65  ncing, the conte
28e10 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61  nts of MemPage a
28e20 72 65 0a 20 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f  re.  ** not impo
28e30 72 74 61 6e 74 2c 20 61 73 20 74 68 65 79 20 77  rtant, as they w
28e40 69 6c 6c 20 62 65 20 72 65 63 61 6c 63 75 6c 61  ill be recalcula
28e50 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 61 67  ted when the pag
28e60 65 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  e is rolled.  **
28e70 20 62 61 63 6b 2e 20 42 75 74 20 68 65 72 65 2c   back. But here,
28e80 20 69 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63   in balance_quic
28e90 6b 28 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69  k(), it is possi
28ea0 62 6c 65 20 74 68 61 74 20 70 50 61 67 65 20 68  ble that pPage h
28eb0 61 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 79 65 74  as .  ** not yet
28ec0 20 62 65 65 6e 20 6d 61 72 6b 65 64 20 64 69 72   been marked dir
28ed0 74 79 20 6f 72 20 77 72 69 74 74 65 6e 20 69 6e  ty or written in
28ee0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
28ef0 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 0a 20  ile. Therefore. 
28f00 20 2a 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   ** it will not 
28f10 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
28f20 6e 64 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f  nd so it is impo
28f30 72 74 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75  rtant to make su
28f40 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
28f50 20 70 61 67 65 20 64 61 74 61 20 61 6e 64 20 63   page data and c
28f60 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61  ontents of MemPa
28f70 67 65 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e  ge are consisten
28f80 74 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 2d  t..  */.  pPage-
28f90 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73  >isInit = 0;.  s
28fa0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
28fb0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 61 73  age(pPage);.  as
28fc0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
28fd0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
28fe0 2f 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  /* If everything
28ff0 20 65 6c 73 65 20 73 75 63 63 65 65 64 65 64 2c   else succeeded,
29000 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
29010 65 6e 74 20 70 61 67 65 2c 20 69 6e 20 0a 20 20  ent page, in .  
29020 2a 2a 20 63 61 73 65 20 74 68 65 20 64 69 76 69  ** case the divi
29030 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65  der cell inserte
29040 64 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62  d caused it to b
29050 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a  ecome overfull..
29060 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
29070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29080 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
29090 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50  e);.    pCur->iP
290a0 61 67 65 2d 2d 3b 0a 20 20 20 20 72 63 20 3d 20  age--;.    rc = 
290b0 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29  balance(pCur, 0)
290c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
290d0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
290e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
290f0 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  BALANCE */../*.*
29100 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
29110 65 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c  edistributes Cel
29120 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20  ls on pPage and 
29130 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69  up to NN*2 sibli
29140 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20  ngs.** of pPage 
29150 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
29160 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
29170 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20   same amount of 
29180 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55  free space..** U
29190 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e  sually NN siblin
291a0 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  gs on either sid
291b0 65 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73  e of pPage is us
291c0 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
291d0 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d  ing,.** though m
291e0 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67  ore siblings mig
291f0 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65  ht come from one
29200 20 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69   side if pPage i
29210 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f  s the first.** o
29220 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20  r last child of 
29230 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20  its parent.  If 
29240 70 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20  pPage has fewer 
29250 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e  than 2*NN siblin
29260 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67  gs.** (something
29270 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20   which can only 
29280 68 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20  happen if pPage 
29290 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
292a0 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20   or a .** child 
292b0 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c  of root) then al
292c0 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c  l available sibl
292d0 69 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65  ings participate
292e0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
292f0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  g..**.** The num
29300 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ber of siblings 
29310 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62  of pPage might b
29320 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64  e increased or d
29330 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20  ecreased by one 
29340 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20  or.** two in an 
29350 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
29360 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
29370 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
29380 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67  ll. The root pag
29390 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20  e.** is special 
293a0 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  and is allowed t
293b0 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  o be nearly empt
293c0 79 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a  y. If pPage is .
293d0 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
293e0 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68  , then the depth
293f0 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67   of the tree mig
29400 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a  ht be increased.
29410 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ** or decreased 
29420 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73  by one, as neces
29430 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68  sary, to keep th
29440 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d  e root page from
29450 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75   being.** overfu
29460 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79  ll or completely
29470 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   empty..**.** No
29480 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
29490 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
294a0 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
294b0 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a   Cells on pPage.
294c0 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
294d0 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
294e0 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
294f0 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  ].  This can hap
29500 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
29510 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
29520 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62   Part of the job
29530 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
29540 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73   is to.** make s
29550 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f  ure all Cells fo
29560 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61  r pPage once aga
29570 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d  in fit in pPage-
29580 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  >aData[]..**.** 
29590 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66  In the course of
295a0 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73   balancing the s
295b0 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65  iblings of pPage
295c0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  , the parent of 
295d0 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62  pPage.** might b
295e0 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
295f0 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66  r underfull.  If
29600 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74   that happens, t
29610 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
29620 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65  .** is called re
29630 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65  cursively on the
29640 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   parent..**.** I
29650 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
29660 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
29670 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65  son, it might le
29680 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ave the database
29690 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74  .** in a corrupt
296a0 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66  ed state.  So if
296b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
296c0 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
296d0 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
296e0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73  olled back..*/.s
296f0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
29700 65 5f 6e 6f 6e 72 6f 6f 74 28 42 74 43 75 72 73  e_nonroot(BtCurs
29710 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
29720 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
29730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29740 20 6f 76 65 72 20 6f 72 20 75 6e 64 65 72 66 75   over or underfu
29750 6c 6c 20 70 61 67 65 20 74 6f 20 62 61 6c 61 6e  ll page to balan
29760 63 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ce */.  MemPage 
29770 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
29780 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
29790 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  nt of pPage */. 
297a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
297b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
297c0 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
297d0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
297e0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
297f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29800 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
29810 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
29820 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
29830 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
29840 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
29850 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
29860 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  m. */.  int nOld
29870 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
29880 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29890 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
298a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  [] */.  int nNew
298b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
298c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
298d0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
298e0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76  [] */.  int nDiv
298f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29900 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29910 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76  f cells in apDiv
29920 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
29930 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
29940 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
29950 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
29960 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
29970 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
29980 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61   of pPage in pPa
29990 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
299a0 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299c0 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
299d0 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
299e0 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
299f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
29a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29a10 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
29a20 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65  .  int leafCorre
29a30 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
29a40 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
29a50 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
29a60 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
29a70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
29a80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
29a90 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
29aa0 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
29ab0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
29ac0 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
29ad0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
29ae0 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
29af0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
29b00 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
29b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
29b20 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
29b30 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
29b40 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
29b50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
29b60 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
29b70 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
29b80 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
29b90 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
29ba0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
29bb0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
29bc0 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
29bd0 69 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20  iSpace2 = 0;    
29be0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
29bf0 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
29c00 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20   aSpace2[] */.  
29c10 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20  int szScratch;  
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c30 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20  Size of scratch 
29c40 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64  memory requested
29c50 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
29c60 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pOld[NB];       
29c70 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
29c80 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e  up to two siblin
29c90 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  gs */.  Pgno pgn
29ca0 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  oOld[NB];       
29cb0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
29cc0 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
29cd0 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  ge in apOld[] */
29ce0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
29cf0 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
29d00 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
29d10 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
29d20 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
29d30 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
29d40 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
29d50 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
29d60 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
29d70 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ing */.  Pgno pg
29d80 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  noNew[NB+2];    
29d90 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
29da0 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
29db0 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  age in apNew[] *
29dc0 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42  /.  u8 *apDiv[NB
29dd0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
29de0 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
29df0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
29e00 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b    int cntNew[NB+
29e10 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
29e20 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c  * Index in aCell
29e30 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72  [] of cell after
29e40 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
29e50 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b  int szNew[NB+2];
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e70 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66  Combined size of
29e80 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20   cells place on 
29e90 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  i-th page */.  u
29ea0 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20  8 **apCell = 0; 
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
29ec0 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
29ed0 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
29ee0 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
29ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
29f00 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
29f10 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
29f20 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b   */.  u8 *aCopy[
29f30 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
29f40 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e  Space for holdin
29f50 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79  g data of apCopy
29f60 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  [] */.  u8 *aSpa
29f70 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ce1;           /
29f80 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69  * Space for copi
29f90 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
29fa0 65 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61  ells before bala
29fb0 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  nce */.  u8 *aSp
29fc0 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ace2 = 0;       
29fd0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65  /* Space for ove
29fe0 72 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63  rflow dividers c
29ff0 65 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ells after balan
2a000 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f  ce */.  u8 *aFro
2a010 6d 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  m = 0;..  pPage 
2a020 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2a030 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
2a040 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a050 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2a060 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2a070 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
2a080 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
2a090 3d 20 31 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  = 1 );..  /* .  
2a0a0 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65  ** Find the pare
2a0b0 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  nt page..  */.  
2a0c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2a0d0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
2a0e0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2a0f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2a100 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2a110 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2a120 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e  Page) || pPage->
2a130 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2a140 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
2a150 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20  Bt;.  pParent = 
2a160 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a170 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61  r->iPage-1];.  a
2a180 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29  ssert( pParent )
2a190 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
2a1a0 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
2a1b0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65  PagerWrite(pPare
2a1c0 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  nt->pDbPage)) ){
2a1d0 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
2a1e0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  e_cleanup;.  }..
2a1f0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2a200 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
2a210 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
2a220 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
2a230 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  arent->pgno));..
2a240 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a250 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
2a260 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65  .  /*.  ** A spe
2a270 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61  cial case:  If a
2a280 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a   new entry has j
2a290 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ust been inserte
2a2a0 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61  d into a.  ** ta
2a2b0 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20  ble (that is, a 
2a2c0 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67  btree with integ
2a2d0 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20  er keys and all 
2a2e0 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76  data at the leav
2a2f0 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  es).  ** and the
2a300 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68   new entry is th
2a310 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2a320 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28  ry in the tree (
2a330 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20  it has the.  ** 
2a340 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65  largest key) the
2a350 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61  n use the specia
2a360 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
2a370 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20  ) routine for.  
2a380 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62  ** balancing.  b
2a390 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
2a3a0 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e  s much faster an
2a3b0 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  d results in a t
2a3c0 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b  ighter.  ** pack
2a3d0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74  ing of data in t
2a3e0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
2a3f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
2a400 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20  ->leaf &&.      
2a410 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2a420 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
2a430 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20  verflow==1 &&.  
2a440 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
2a450 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
2a460 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70  nCell &&.      p
2a470 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20  Parent->pgno!=1 
2a480 26 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74  &&.      get4byt
2a490 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2a4a0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2a4b0 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d  fset+8])==pPage-
2a4c0 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61  >pgno.  ){.    a
2a4d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
2a4e0 74 4b 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20  tKey );.    /*. 
2a4f0 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63     ** TODO: Chec
2a500 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74  k the siblings t
2a510 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50  o the left of pP
2a520 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74  age. It may be t
2a530 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20  hat.    ** they 
2a540 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64  are not full and
2a550 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20   no new page is 
2a560 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
2a570 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61  .    return bala
2a580 6e 63 65 5f 71 75 69 63 6b 28 70 43 75 72 29 3b  nce_quick(pCur);
2a590 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
2a5a0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
2a5b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a5c0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2a5d0 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f  Page)) ){.    go
2a5e0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2a5f0 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  up;.  }..  /*.  
2a600 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c  ** Find the cell
2a610 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
2a620 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63  age whose left c
2a630 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b  hild points back
2a640 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20  .  ** to pPage. 
2a650 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61   The "idx" varia
2a660 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78  ble is the index
2a670 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20   of that cell.  
2a680 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73  If pPage.  ** is
2a690 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63   the rightmost c
2a6a0 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20  hild of pParent 
2a6b0 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20  then set idx to 
2a6c0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a  pParent->nCell .
2a6d0 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75    */.  idx = pCu
2a6e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a6f0 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72  Page-1];.  asser
2a700 74 50 61 72 65 6e 74 49 6e 64 65 78 28 70 50 61  tParentIndex(pPa
2a710 72 65 6e 74 2c 20 69 64 78 2c 20 70 50 61 67 65  rent, idx, pPage
2a720 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20  ->pgno);..  /*. 
2a730 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67   ** Find sibling
2a740 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20   pages to pPage 
2a750 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  and the cells in
2a760 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69   pParent that di
2a770 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69  vide.  ** the si
2a780 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65  blings.  An atte
2a790 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
2a7a0 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
2a7b0 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73  on either.  ** s
2a7c0 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d  ide of pPage.  M
2a7d0 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
2a7e0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
2a7f0 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69  side, however, i
2a800 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65  f.  ** pPage the
2a810 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
2a820 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
2a830 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
2a840 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a    If pParent.  *
2a850 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
2a860 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
2a870 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
2a880 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
2a890 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20  n..  */.  nxDiv 
2a8a0 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66  = idx - NN;.  if
2a8b0 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70  ( nxDiv + NB > p
2a8c0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
2a8d0 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61  .    nxDiv = pPa
2a8e0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42  rent->nCell - NB
2a8f0 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   + 1;.  }.  if( 
2a900 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e  nxDiv<0 ){.    n
2a910 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDiv = 0;.  }.  
2a920 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nDiv = 0;.  for(
2a930 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c  i=0, k=nxDiv; i<
2a940 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20  NB; i++, k++){. 
2a950 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74     if( k<pParent
2a960 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
2a970 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
2a980 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29  Cell(pParent, k)
2a990 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a  ;.      nDiv++;.
2a9a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
2a9b0 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a  Parent->leaf );.
2a9c0 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
2a9d0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
2a9e0 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[i]);.    }else
2a9f0 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d   if( k==pParent-
2aa00 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
2aa10 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
2aa20 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2aa30 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2aa40 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2aa50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
2aa60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2aa70 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
2aa80 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64  age(pBt, pgnoOld
2aa90 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  [i], &apOld[i]);
2aaa0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2aab0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2aac0 75 70 3b 0a 20 20 20 20 2f 2a 20 61 70 4f 6c 64  up;.    /* apOld
2aad0 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
2aae0 20 6b 3b 20 2a 2f 0a 20 20 20 20 61 70 43 6f 70   k; */.    apCop
2aaf0 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73  y[i] = 0;.    as
2ab00 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b  sert( i==nOld );
2ab10 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20  .    nOld++;.   
2ab20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
2ab30 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
2ab40 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
2ab50 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  low;.  }..  /* M
2ab60 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20  ake nMaxCells a 
2ab70 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e  multiple of 4 in
2ab80 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72   order to preser
2ab90 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61  ve 8-byte.  ** a
2aba0 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d  lignment */.  nM
2abb0 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43  axCells = (nMaxC
2abc0 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20  ells + 3)&~3;.. 
2abd0 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
2abe0 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
2abf0 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20  ry structures.  
2ac00 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  */.  szScratch =
2ac10 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
2ac20 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
2ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac40 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
2ac50 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
2ac60 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac80 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
2ac90 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28  .     + (ROUND8(
2aca0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
2acb0 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a  +pBt->pageSize)*
2acc0 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a  NB  /* aCopy */.
2acd0 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65       + pBt->page
2ace0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad00 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f     /* aSpace1 */
2ad10 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56  .     + (ISAUTOV
2ad20 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c  ACUUM ? nMaxCell
2ad30 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20  s : 0);         
2ad40 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a      /* aFrom */.
2ad50 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
2ad60 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
2ad70 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
2ad80 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
2ad90 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2ada0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
2adb0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2adc0 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
2add0 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
2ade0 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43  nMaxCells];.  aC
2adf0 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73  opy[0] = (u8*)&s
2ae00 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
2ae10 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2ae20 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2ae30 28 61 43 6f 70 79 5b 30 5d 29 20 29 3b 0a 20 20  (aCopy[0]) );.  
2ae40 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69  for(i=1; i<NB; i
2ae50 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69  ++){.    aCopy[i
2ae60 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b  ] = &aCopy[i-1][
2ae70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f  pBt->pageSize+RO
2ae80 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
2ae90 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65  age))];.    asse
2aea0 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d  rt( ((aCopy[i] -
2aeb0 20 28 75 38 2a 29 30 29 20 26 20 37 29 3d 3d 30   (u8*)0) & 7)==0
2aec0 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c   ); /* 8-byte al
2aed0 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64  ignment required
2aee0 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65   */.  }.  aSpace
2aef0 31 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d  1 = &aCopy[NB-1]
2af00 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
2af10 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
2af20 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72  Page))];.  asser
2af30 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2af40 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29  IGNMENT(aSpace1)
2af50 20 29 3b 0a 20 20 69 66 28 20 49 53 41 55 54 4f   );.  if( ISAUTO
2af60 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 61 46  VACUUM ){.    aF
2af70 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70  rom = &aSpace1[p
2af80 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
2af90 20 7d 0a 20 20 61 53 70 61 63 65 32 20 3d 20 73   }.  aSpace2 = s
2afa0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
2afb0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  (pBt->pageSize);
2afc0 0a 20 20 69 66 28 20 61 53 70 61 63 65 32 3d 3d  .  if( aSpace2==
2afd0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
2afe0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2aff0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2b000 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  anup;.  }.  .  /
2b010 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69  *.  ** Make copi
2b020 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  es of the conten
2b030 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69  t of pPage and i
2b040 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f  ts siblings into
2b050 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68   aOld[]..  ** Th
2b060 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
2b070 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
2b080 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
2b090 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a  opies rather.  *
2b0a0 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
2b0b0 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
2b0c0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2b0d0 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
2b0e0 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f  e.  ** process o
2b0f0 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
2b100 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ten..  */.  for(
2b110 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
2b120 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
2b130 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20  p = apCopy[i] = 
2b140 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b  (MemPage*)aCopy[
2b150 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i];.    memcpy(p
2b160 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
2b170 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
2b180 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f    p->aData = (vo
2b190 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d  id*)&p[1];.    m
2b1a0 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20  emcpy(p->aData, 
2b1b0 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
2b1c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
2b1d0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2b1e0 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
2b1f0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
2b200 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
2b210 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2b220 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
2b230 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
2b240 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
2b250 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
2b260 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
2b270 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
2b280 20 66 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20   form aSpace1[] 
2b290 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
2b2a0 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
2b2b0 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
2b2c0 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
2b2d0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2b2e0 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
2b2f0 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
2b300 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
2b310 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
2b320 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
2b330 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
2b340 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
2b350 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
2b360 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
2b370 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
2b380 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
2b390 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
2b3a0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
2b3b0 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
2b3c0 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
2b3d0 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
2b3e0 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
2b3f0 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
2b400 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
2b410 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2b420 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
2b430 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
2b440 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
2b450 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
2b460 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
2b470 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
2b480 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
2b490 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
2b4a0 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
2b4b0 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
2b4c0 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
2b4d0 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30    */.  nCell = 0
2b4e0 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ;.  leafCorrecti
2b4f0 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  on = pPage->leaf
2b500 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
2b510 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 3b   pPage->hasData;
2b520 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
2b530 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
2b540 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
2b550 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Copy[i];.    int
2b560 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
2b570 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
2b580 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
2b590 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
2b5a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2b5b0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
2b5c0 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
2b5d0 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
2b5e0 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
2b5f0 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
2b600 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
2b610 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
2b620 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20  ll[nCell]);.    
2b630 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2b640 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  UM ){.        in
2b650 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72  t a;.        aFr
2b660 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 28 75 38 29  om[nCell] = (u8)
2b670 69 3b 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  i;   assert( i>=
2b680 30 20 26 26 20 69 3c 36 20 29 3b 0a 20 20 20 20  0 && i<6 );.    
2b690 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70      for(a=0; a<p
2b6a0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20  Old->nOverflow; 
2b6b0 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  a++){.          
2b6c0 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  if( pOld->aOvfl[
2b6d0 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c  a].pCell==apCell
2b6e0 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20  [nCell] ){.     
2b6f0 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
2b700 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20  ll] = 0xFF;.    
2b710 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b720 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b730 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2b740 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
2b750 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  }.    if( i<nOld
2b760 2d 31 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  -1 ){.      u16 
2b770 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
2b780 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
2b790 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  i]);.      if( l
2b7a0 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
2b7b0 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c     /* With the L
2b7c0 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50  EAFDATA flag, pP
2b7d0 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64  arent cells hold
2b7e0 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68   only INTKEYs th
2b7f0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72  at.        ** ar
2b800 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20  e duplicates of 
2b810 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c  keys on the chil
2b820 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65  d pages.  We nee
2b830 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20  d to remove.    
2b840 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64      ** the divid
2b850 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50  er cells from pP
2b860 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64  arent, but the d
2b870 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72  ividers cells ar
2b880 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  e not.        **
2b890 20 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c   added to apCell
2b8a0 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20  [] because they 
2b8b0 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
2b8c0 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20  f child cells.. 
2b8d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2b8e0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
2b8f0 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
2b900 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b910 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
2b920 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b930 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
2b940 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
2b950 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20  l[nCell] = sz;. 
2b960 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26         pTemp = &
2b970 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d  aSpace1[iSpace1]
2b980 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
2b990 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  1 += sz;.       
2b9a0 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
2b9b0 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a  ->pageSize/4 );.
2b9c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b9d0 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61  iSpace1<=pBt->pa
2b9e0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
2b9f0 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
2ba00 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
2ba10 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43         apCell[nC
2ba20 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
2ba30 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
2ba40 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
2ba50 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
2ba60 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
2ba70 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
2ba80 7d 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  }.        dropCe
2ba90 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
2baa0 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  v, sz);.        
2bab0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
2bac0 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61  ection==0 || lea
2bad0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
2bae0 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
2baf0 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 28 75 31 36 29  [nCell] -= (u16)
2bb00 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2bb10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bb20 67 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d  get4byte(pTemp)=
2bb30 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20  =pgnoOld[i] );. 
2bb40 20 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64         if( !pOld
2bb50 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2bb60 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
2bb70 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
2bb80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2bb90 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20  e right pointer 
2bba0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
2bbb0 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74  e pOld becomes t
2bbc0 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  he left.        
2bbd0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
2bbe0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2bbf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
2bc00 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
2bc10 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
2bc20 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  [pOld->hdrOffset
2bc30 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  +8], 4);.       
2bc40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bc50 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2bc60 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
2bc70 20 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43           if( szC
2bc80 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
2bc90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2bca0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
2bcb0 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
2bcc0 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
2bcd0 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c             szCel
2bce0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20  l[nCell] = 4;.  
2bcf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bd00 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c    }.        nCel
2bd10 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
2bd20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
2bd30 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
2bd40 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2bd50 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
2bd60 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
2bd70 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
2bd80 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
2bd90 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
2bda0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
2bdb0 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
2bdc0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
2bdd0 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
2bde0 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
2bdf0 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
2be00 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
2be10 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
2be20 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
2be30 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
2be40 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
2be50 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
2be60 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
2be70 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
2be80 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
2be90 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
2bea0 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
2beb0 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
2bec0 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
2bed0 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
2bee0 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
2bef0 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
2bf00 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
2bf10 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
2bf20 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
2bf30 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
2bf40 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
2bf50 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
2bf60 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
2bf70 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
2bf80 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
2bf90 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2bfa0 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
2bfb0 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
2bfc0 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
2bfd0 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
2bfe0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2bff0 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
2c000 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
2c010 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
2c020 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
2c030 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
2c040 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
2c050 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
2c060 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
2c070 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
2c080 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
2c090 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
2c0a0 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
2c0b0 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
2c0c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
2c0d0 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
2c0e0 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
2c0f0 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
2c100 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
2c110 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
2c120 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
2c130 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
2c140 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
2c150 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
2c160 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
2c170 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
2c180 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
2c190 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
2c1a0 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
2c1b0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
2c1c0 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
2c1d0 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
2c1e0 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
2c1f0 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
2c200 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
2c210 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
2c220 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
2c230 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
2c240 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
2c250 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
2c260 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
2c270 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
2c280 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
2c290 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
2c2a0 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
2c2b0 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
2c2c0 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
2c2d0 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
2c2e0 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
2c2f0 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
2c300 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
2c310 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
2c320 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
2c330 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
2c340 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
2c350 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
2c360 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
2c370 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
2c380 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
2c390 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
2c3a0 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
2c3b0 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
2c3c0 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
2c3d0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
2c3e0 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
2c3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2c400 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
2c410 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
2c420 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
2c430 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
2c440 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2c450 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
2c460 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
2c470 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
2c480 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
2c490 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
2c4a0 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
2c4b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
2c4c0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2c4d0 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
2c4e0 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
2c4f0 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
2c500 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
2c510 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
2c520 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
2c530 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
2c540 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
2c550 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
2c560 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
2c570 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
2c580 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
2c590 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
2c5a0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
2c5b0 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
2c5c0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
2c5d0 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
2c5e0 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
2c5f0 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
2c600 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
2c610 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
2c620 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20  ew[0])>0) or we 
2c630 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76  are the.  ** a v
2c640 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2c650 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f  .  A virtual roo
2c660 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74  t page is when t
2c670 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a  he real root.  *
2c680 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  * page is page 1
2c690 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20   and we are the 
2c6a0 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68  only child of th
2c6b0 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  at page..  */.  
2c6c0 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
2c6d0 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
2c6e0 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
2c6f0 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
2c700 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
2c710 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
2c720 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
2c730 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
2c740 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
2c750 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31  t( pPage->pgno>1
2c760 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20   );.  pageFlags 
2c770 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  = pPage->aData[0
2c780 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
2c790 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  k; i++){.    Mem
2c7a0 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Page *pNew;.    
2c7b0 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  if( i<nOld ){.  
2c7c0 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
2c7d0 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a  [i] = apOld[i];.
2c7e0 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d        pgnoNew[i]
2c7f0 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20   = pgnoOld[i];. 
2c800 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20       apOld[i] = 
2c810 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
2c820 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c830 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
2c840 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
2c850 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2c860 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2c870 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
2c880 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
2c890 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
2c8a0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2c8b0 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
2c8c0 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77  oNew[i], pgnoNew
2c8d0 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20  [i-1], 0);.     
2c8e0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2c8f0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2c900 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
2c910 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
2c920 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  w++;.    }.  }..
2c930 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
2c940 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
2c950 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
2c960 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
2c970 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
2c980 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
2c990 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
2c9a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2c9b0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2c9c0 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
2c9d0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
2c9e0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
2c9f0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
2ca00 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
2ca10 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
2ca20 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
2ca30 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
2ca40 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
2ca50 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
2ca60 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
2ca70 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
2ca80 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
2ca90 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
2caa0 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
2cab0 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
2cac0 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
2cad0 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
2cae0 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
2caf0 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
2cb00 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
2cb10 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
2cb20 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
2cb30 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
2cb40 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
2cb50 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
2cb60 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
2cb70 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
2cb80 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
2cb90 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
2cba0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
2cbb0 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
2cbc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
2cbd0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
2cbe0 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
2cbf0 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
2cc00 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
2cc10 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
2cc20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
2cc30 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
2cc40 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d  inV = pgnoNew[i]
2cc50 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
2cc60 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
2cc70 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
2cc80 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b      if( pgnoNew[
2cc90 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  j]<(unsigned)min
2cca0 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
2ccb0 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
2ccc0 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d  inV = pgnoNew[j]
2ccd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2cce0 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29      if( minI>i )
2ccf0 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20  {.      int t;. 
2cd00 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54       MemPage *pT
2cd10 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f  ;.      t = pgno
2cd20 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  New[i];.      pT
2cd30 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
2cd40 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
2cd50 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  pgnoNew[minI];. 
2cd60 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
2cd70 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
2cd80 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d     pgnoNew[minI]
2cd90 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65   = t;.      apNe
2cda0 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
2cdb0 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
2cdc0 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
2cdd0 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25  %d %d %d  new: %
2cde0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
2cdf0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
2ce00 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c  )\n",.    pgnoOl
2ce10 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  d[0], .    nOld>
2ce20 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20  =2 ? pgnoOld[1] 
2ce30 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
2ce40 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20   ? pgnoOld[2] : 
2ce50 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30  0,.    pgnoNew[0
2ce60 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  ], szNew[0],.   
2ce70 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e   nNew>=2 ? pgnoN
2ce80 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[1] : 0, nNew>
2ce90 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
2cea0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
2ceb0 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c   pgnoNew[2] : 0,
2cec0 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
2ced0 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
2cee0 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33  w>=4 ? pgnoNew[3
2cef0 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  ] : 0, nNew>=4 ?
2cf00 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
2cf10 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e     nNew>=5 ? pgn
2cf20 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[4] : 0, nNe
2cf30 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
2cf40 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  : 0));..  /*.  *
2cf50 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
2cf60 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
2cf70 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
2cf80 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
2cf90 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
2cfa0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
2cfb0 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
2cfc0 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
2cfd0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2cfe0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
2cff0 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
2d000 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
2d010 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
2d020 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
2d030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2d040 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2d050 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
2d060 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20  gno==pgnoNew[i] 
2d070 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
2d080 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
2d090 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
2d0a0 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b  ge(pNew, cntNew[
2d0b0 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d  i]-j, &apCell[j]
2d0c0 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20  , &szCell[j]);. 
2d0d0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2d0e0 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65  >nCell>0 || (nNe
2d0f0 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30  w==1 && cntNew[0
2d100 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  ]==0) );.    ass
2d110 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72  ert( pNew->nOver
2d120 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  flow==0 );..    
2d130 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2d140 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2d150 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
2d160 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
2d170 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  tries.    ** tha
2d180 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  t point to the s
2d190 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72  iblings that wer
2d1a0 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68  e rearranged. Th
2d1b0 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74  ese can be: left
2d1c0 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e  .    ** children
2d1d0 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72   of cells, the r
2d1e0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
2d1f0 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66  e page, or overf
2d200 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a  low pages.    **
2d210 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63   pointed to by c
2d220 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ells..    */.   
2d230 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2d240 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  M ){.      for(k
2d250 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b  =j; k<cntNew[i];
2d260 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   k++){.        a
2d270 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c  ssert( k<nMaxCel
2d280 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ls );.        if
2d290 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46  ( aFrom[k]==0xFF
2d2a0 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d   || apCopy[aFrom
2d2b0 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  [k]]->pgno!=pNew
2d2c0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
2d2d0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2d2e0 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a  utOvfl(pNew, k-j
2d2f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2d300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d310 26 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  & leafCorrection
2d320 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2d330 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2d340 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
2d350 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d  apCell[k]), PTRM
2d360 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
2d370 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
2d380 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2d390 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d3a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
2d3b0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2d3c0 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  up;.          }.
2d3d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d3e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d  }.    }..    j =
2d3f0 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
2d400 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
2d410 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
2d420 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
2d430 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
2d440 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
2d450 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
2d460 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
2d470 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
2d480 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77  /.    if( i<nNew
2d490 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b  -1 && j<nCell ){
2d4a0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
2d4b0 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
2d4c0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
2d4d0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2d4e0 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
2d4f0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
2d500 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
2d510 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
2d520 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
2d530 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
2d540 70 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a  pace2[iSpace2];.
2d550 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
2d560 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2d570 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
2d580 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
2d590 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
2d5a0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 0a 20 20  ISAUTOVACUUM .  
2d5b0 20 20 20 20 20 20 20 26 26 20 28 61 46 72 6f 6d         && (aFrom
2d5c0 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43  [j]==0xFF || apC
2d5d0 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70  opy[aFrom[j]]->p
2d5e0 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29  gno!=pNew->pgno)
2d5f0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2d600 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2d610 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
2d620 74 65 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d 41  te(pCell), PTRMA
2d630 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
2d640 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
2d650 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d660 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2d670 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2d680 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20  eanup;.         
2d690 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d6a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
2d6b0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
2d6c0 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
2d6d0 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
2d6e0 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
2d6f0 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
2d700 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
2d710 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
2d720 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
2d730 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
2d740 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
2d750 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
2d760 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
2d770 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
2d780 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
2d790 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
2d7a0 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
2d7b0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
2d7c0 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
2d7d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
2d7e0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
2d7f0 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
2d800 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
2d810 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61  eCellPtr(pNew, a
2d820 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29  pCell[j], &info)
2d830 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
2d840 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = pTemp;.       
2d850 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
2d860 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c  (pParent, pCell,
2d870 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
2d880 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20  , 0, 0, &sz);.  
2d890 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d8a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d8b0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2d8c0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2d8d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 65     }.        pTe
2d8e0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
2d8f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
2d900 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
2d910 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
2d920 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
2d930 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
2d940 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
2d950 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
2d960 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
2d970 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
2d980 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
2d990 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
2d9a0 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
2d9b0 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
2d9c0 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
2d9d0 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
2d9e0 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33   ** (see sqlite3
2d9f0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
2da00 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
2da10 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
2da20 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
2da30 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
2da40 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
2da50 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
2da60 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
2da70 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
2da80 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
2da90 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
2daa0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2dab0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
2dac0 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
2dad0 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
2dae0 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
2daf0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
2db00 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
2db10 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
2db20 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
2db30 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
2db40 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
2db50 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
2db60 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
2db70 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
2db80 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
2db90 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
2dba0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
2dbb0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
2dbc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
2dbd0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2dbe0 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
2dbf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2dc00 0a 20 20 20 20 20 20 69 53 70 61 63 65 32 20 2b  .      iSpace2 +
2dc10 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
2dc20 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
2dc30 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
2dc40 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 32   assert( iSpace2
2dc50 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
2dc60 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  );.      rc = in
2dc70 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
2dc80 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
2dc90 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20  sz, pTemp, 4);. 
2dca0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2dcb0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
2dcc0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2dcd0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2dce0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2dcf0 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
2dd00 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
2dd10 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
2dd20 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
2dd30 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e  t,nxDiv), pNew->
2dd40 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  pgno);..      /*
2dd50 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2dd60 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2dd70 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c  ase, and not a l
2dd80 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20  eaf-data tree,. 
2dd90 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64       ** then upd
2dda0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
2ddb0 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72  map with an entr
2ddc0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
2ddd0 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
2dde0 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a   that the cell j
2ddf0 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69  ust inserted poi
2de00 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e  nts to (if any).
2de10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2de20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2de30 20 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b   && !leafData ){
2de40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
2de50 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72  rmapPutOvfl(pPar
2de60 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20  ent, nxDiv);.   
2de70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2de80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2de90 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2dea0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2deb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2dec0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
2ded0 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iv++;.    }..   
2dee0 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e   /* Set the poin
2def0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
2df00 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  r the new siblin
2df10 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69  g page. */.    i
2df20 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2df30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
2df40 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
2df50 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
2df60 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
2df70 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2df80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2df90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62  {.        goto b
2dfa0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2dfb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dfc0 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
2dfd0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2dfe0 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73  ( nOld>0 );.  as
2dff0 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
2e000 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73    if( (pageFlags
2e010 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20   & PTF_LEAF)==0 
2e020 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c  ){.    u8 *zChil
2e030 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  d = &apCopy[nOld
2e040 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20  -1]->aData[8];. 
2e050 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
2e060 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
2e070 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a  8], zChild, 4);.
2e080 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2e090 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
2e0a0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2e0b0 2c 20 67 65 74 34 62 79 74 65 28 7a 43 68 69 6c  , get4byte(zChil
2e0c0 64 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  d), PTRMAP_BTREE
2e0d0 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  , apNew[nNew-1]-
2e0e0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2e0f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e100 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
2e110 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2e120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e130 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
2e140 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2e150 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
2e160 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
2e170 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
2e180 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e  nCell+pParent->n
2e190 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2e1a0 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69  /* Right-most si
2e1b0 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67  bling is the rig
2e1c0 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ht-most child of
2e1d0 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20   pParent */.    
2e1e0 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
2e1f0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2e200 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2e210 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29  pgnoNew[nNew-1])
2e220 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2e230 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
2e240 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74  ling is the left
2e250 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69   child of the fi
2e260 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61  rst entry in pPa
2e270 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74  rent.    ** past
2e280 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2e290 64 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f  divider entry */
2e2a0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69  .    put4byte(fi
2e2b0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2e2c0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20  Parent, nxDiv), 
2e2d0 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29  pgnoNew[nNew-1])
2e2e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
2e2f0 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   Balance the par
2e300 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20  ent page.  Note 
2e310 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  that the current
2e320 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d 69   page (pPage) mi
2e330 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ght.  ** have be
2e340 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  en added to the 
2e350 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d  freelist so it m
2e360 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62  ight no longer b
2e370 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
2e380 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72 65   ** But the pare
2e390 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77  nt page will alw
2e3a0 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ays be initializ
2e3b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
2e3c0 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e  t( pParent->isIn
2e3d0 69 74 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  it );.  sqlite3S
2e3e0 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c  cratchFree(apCel
2e3f0 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30  l);.  apCell = 0
2e400 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
2e410 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69  NCE: finished wi
2e420 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65  th %d: old=%d ne
2e430 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22  w=%d cells=%d\n"
2e440 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ,.          pPag
2e450 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e  e->pgno, nOld, n
2e460 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20  New, nCell));.  
2e470 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2e480 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
2e490 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43  age(pPage);.  pC
2e4a0 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 72  ur->iPage--;.  r
2e4b0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
2e4c0 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20  , 0);.  .  /*.  
2e4d0 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72  ** Cleanup befor
2e4e0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
2e4f0 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  /.balance_cleanu
2e500 70 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  p:.  sqlite3Page
2e510 46 72 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20  Free(aSpace2);. 
2e520 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
2e530 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66  ree(apCell);.  f
2e540 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
2e550 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
2e560 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
2e570 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2e580 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
2e590 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
2e5a0 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  New[i]);.  }.  p
2e5b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e5c0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66  ->iPage]->nOverf
2e5d0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  low = 0;..  retu
2e5e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e5f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2e600 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72  called for the r
2e610 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74  oot page of a bt
2e620 72 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  ree when the roo
2e630 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  t.** page contai
2e640 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68  ns no cells.  Th
2e650 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75  is is an opportu
2e660 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65  nity to make the
2e670 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77   tree.** shallow
2e680 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e  er by one level.
2e690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2e6a0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
2e6b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2e6c0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2e6d0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2e6e0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
2e6f0 20 42 2d 54 72 65 65 20 2a 2f 0a 20 20 4d 65 6d   B-Tree */.  Mem
2e700 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
2e710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2e720 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65   only child page
2e730 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50   of pPage */.  P
2e740 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
2e750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2e760 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
2e770 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72  Child */.  int r
2e780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2e790 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2e7a0 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70  n code from subp
2e7b0 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42  rocedures */.  B
2e7c0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
2e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e7e0 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65  * The main BTree
2e7f0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2e800 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  int mxCellPerPag
2e810 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2e820 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2e830 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65  f cells per page
2e840 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2e850 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2e860 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
2e870 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67  from pages being
2e880 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
2e890 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2e8b0 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
2e8c0 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73   cells */..  ass
2e8d0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2e8e0 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ==0 );.  pPage =
2e8f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2e900 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2e910 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2e920 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e930 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2e940 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2e950 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
2e960 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50  ->pBt;.  mxCellP
2e970 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c  erPage = MX_CELL
2e980 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20  (pBt);.  apCell 
2e990 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2e9a0 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28   mxCellPerPage*(
2e9b0 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65  sizeof(u8*)+size
2e9c0 6f 66 28 75 31 36 29 29 20 29 3b 0a 20 20 69 66  of(u16)) );.  if
2e9d0 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65  ( apCell==0 ) re
2e9e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2e9f0 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75  M;.  szCell = (u
2ea00 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65  16*)&apCell[mxCe
2ea10 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66  llPerPage];.  if
2ea20 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2ea30 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
2ea40 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
2ea50 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41  empty */.    TRA
2ea60 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d  CE(("BALANCE: em
2ea70 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c  pty table %d\n",
2ea80 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
2ea90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2eaa0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
2eab0 20 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f   empty but has o
2eac0 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73  ne child.  Trans
2ead0 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69  fer the.    ** i
2eae0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2eaf0 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69  that one child i
2eb00 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67  nto the root pag
2eb10 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20  e if it .    ** 
2eb20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20  will fit.  This 
2eb30 72 65 64 75 63 65 73 20 74 68 65 20 64 65 70 74  reduces the dept
2eb40 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 62 79  h of the tree by
2eb50 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
2eb60 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   ** If the root 
2eb70 70 61 67 65 20 69 73 20 70 61 67 65 20 31 2c 20  page is page 1, 
2eb80 69 74 20 68 61 73 20 6c 65 73 73 20 73 70 61 63  it has less spac
2eb90 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e  e available than
2eba0 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c  .    ** its chil
2ebb0 64 20 28 64 75 65 20 74 6f 20 74 68 65 20 31 30  d (due to the 10
2ebc0 30 20 62 79 74 65 20 68 65 61 64 65 72 20 74 68  0 byte header th
2ebd0 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
2ebe0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a   beginning.    *
2ebf0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
2ec00 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69  e fle), so it mi
2ec10 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ght not be able 
2ec20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74  to hold all of t
2ec30 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  he .    ** infor
2ec40 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  mation currently
2ec50 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2ec60 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69  e child.  If thi
2ec70 73 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  s is the .    **
2ec80 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e   case, then do n
2ec90 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66  ot do the transf
2eca0 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20  er.  Leave page 
2ecb0 31 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20  1 empty except. 
2ecc0 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69     ** for the ri
2ecd0 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74  ght-pointer to t
2ece0 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  he child page.  
2ecf0 54 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62  The child page b
2ed00 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68  ecomes.    ** th
2ed10 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f  e virtual root o
2ed20 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20  f the tree..    
2ed30 2a 2f 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  */.    VVA_ONLY(
2ed40 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66   pCur->pagesShuf
2ed50 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20  fled = 1 );.    
2ed60 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34  pgnoChild = get4
2ed70 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2ed80 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2ed90 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
2eda0 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30  ert( pgnoChild>0
2edb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2edc0 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72  pgnoChild<=pager
2edd0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d  Pagecount(pPage-
2ede0 3e 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  >pBt) );.    rc 
2edf0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2ee00 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74  tPage(pPage->pBt
2ee10 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43  , pgnoChild, &pC
2ee20 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66  hild, 0);.    if
2ee30 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2ee40 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
2ee50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2ee60 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
2ee70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2ee80 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
2ee90 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
2eea0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c   ) goto end_shal
2eeb0 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
2eec0 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
2eed0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  d->nOverflow==0 
2eee0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  );.      if( pCh
2eef0 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20  ild->nFree>=100 
2ef00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2ef10 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74  e child informat
2ef20 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ion will fit on 
2ef30 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73  the root page, s
2ef40 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20  o do the.       
2ef50 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20   ** copy */.    
2ef60 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2ef70 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2ef80 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
2ef90 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
2efa0 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d  r(i=0; i<pChild-
2efb0 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
2efc0 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69          apCell[i
2efd0 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68  ] = findCell(pCh
2efe0 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20  ild,i);.        
2eff0 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65    szCell[i] = ce
2f000 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64  llSizePtr(pChild
2f010 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20  , apCell[i]);.  
2f020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f030 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61  assemblePage(pPa
2f040 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ge, pChild->nCel
2f050 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  l, apCell, szCel
2f060 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l);.        /* C
2f070 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f  opy the right-po
2f080 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
2f090 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ld to the parent
2f0a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
2f0b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2f0c0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2f0d0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2f0e0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2f0f0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2f100 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2f110 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  8], .           
2f120 20 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c   get4byte(&pChil
2f130 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d  d->aData[pChild-
2f140 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
2f150 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
2f160 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
2f170 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2f180 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
2f190 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61  d transfer to pa
2f1a0 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
2f1b0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
2f1c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2f1d0 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d   The child has m
2f1e0 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
2f1f0 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  that will fit on
2f200 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20   the root..     
2f210 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69     ** The tree i
2f220 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63  s already balanc
2f230 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e  ed.  Do nothing.
2f240 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43   */.        TRAC
2f250 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
2f260 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66  ld %d will not f
2f270 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c  it on page 1\n",
2f280 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2f290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2f2a0 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  se{.      memcpy
2f2b0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70  (pPage->aData, p
2f2c0 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50  Child->aData, pP
2f2d0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2f2e0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
2f2f0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2f300 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f310 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2f320 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 61 73  pPage);.      as
2f330 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2f340 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65  _OK );.      fre
2f350 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2f360 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
2f370 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63  ANCE: transfer c
2f380 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f  hild %d into roo
2f390 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t %d\n",.       
2f3a0 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70         pChild->p
2f3b0 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  gno, pPage->pgno
2f3c0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ));.    }.    as
2f3d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2f3e0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66  erflow==0 );.#if
2f3f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f400 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2f410 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2f420 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2f430 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2f440 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2f450 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  pPage);.    }.#e
2f460 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65  ndif.    release
2f470 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2f480 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  }.end_shallow_ba
2f490 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33  lance:.  sqlite3
2f4a0 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  _free(apCell);. 
2f4b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2f4c0 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  /*.** The root p
2f4d0 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a  age is overfull.
2f4e0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2f4f0 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20  happens, Create 
2f500 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2f510 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a   and copy the.**
2f520 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2f530 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63   root into the c
2f540 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65  hild.  Then make
2f550 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2f560 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  e an empty page 
2f570 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20  with rightChild 
2f580 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2f590 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20  new.** child.   
2f5a0 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61  Finally, call ba
2f5b0 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29  lance_internal()
2f5c0 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c   on the new chil
2f5d0 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74  d.** to cause it
2f5e0 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74   to split..*/.st
2f5f0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2f600 5f 64 65 65 70 65 72 28 42 74 43 75 72 73 6f 72  _deeper(BtCursor
2f610 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
2f620 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
2f630 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
2f640 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
2f650 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
2f660 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 50 6f  pPage;     /* Po
2f670 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 6f 6f  inter to the roo
2f680 74 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50  t page */.  MemP
2f690 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20  age *pChild;    
2f6a0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
2f6b0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
2f6c0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
2f6d0 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ld;     /* Page 
2f6e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
2f6f0 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
2f700 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2f710 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f720 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75  BTree */.  int u
2f730 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  sableSize;     /
2f740 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73  * Total usable s
2f750 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f  ize of a page */
2f760 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2f770 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2f780 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  t of the parent 
2f790 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64  page */.  u8 *cd
2f7a0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
2f7b0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
2f7c0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2f7d0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
2f7e0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2f7f0 20 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20   page header in 
2f800 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  parent */.  int 
2f810 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
2f820 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e  /* Offset to con
2f830 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65  tent of first ce
2f840 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  ll in parent */.
2f850 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2f860 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >iPage==0 );.  a
2f870 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2f880 61 67 65 5b 30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  age[0]->nOverflo
2f890 77 3e 30 20 29 3b 0a 0a 20 20 56 56 41 5f 4f 4e  w>0 );..  VVA_ON
2f8a0 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53  LY( pCur->pagesS
2f8b0 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20  huffled = 1 );. 
2f8c0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2f8d0 70 50 61 67 65 5b 30 5d 3b 0a 20 20 70 42 74 20  pPage[0];.  pBt 
2f8e0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2f8f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2f900 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2f910 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2f920 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2f930 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2f940 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
2f950 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2f960 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43  reePage(pBt, &pC
2f970 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64  hild, &pgnoChild
2f980 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30  , pPage->pgno, 0
2f990 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2f9a0 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
2f9b0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2f9c0 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
2f9d0 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
2f9e0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
2f9f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
2fa00 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2fa10 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
2fa20 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2fa30 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74    cbrk = get2byt
2fa40 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
2fa50 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c  .  cdata = pChil
2fa60 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63  d->aData;.  memc
2fa70 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b  py(cdata, &data[
2fa80 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c  hdr], pPage->cel
2fa90 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d  lOffset+2*pPage-
2faa0 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d  >nCell-hdr);.  m
2fab0 65 6d 63 70 79 28 26 63 64 61 74 61 5b 63 62 72  emcpy(&cdata[cbr
2fac0 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
2fad0 20 75 73 61 62 6c 65 53 69 7a 65 2d 63 62 72 6b   usableSize-cbrk
2fae0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  );..  assert( pC
2faf0 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  hild->isInit==0 
2fb00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2fb10 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
2fb20 43 68 69 6c 64 29 3b 0a 20 20 69 66 28 20 72 63  Child);.  if( rc
2fb30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fb40 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
2fb50 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a  Page->nOverflow*
2fb60 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
2fb70 76 66 6c 5b 30 5d 29 3b 0a 20 20 20 20 6d 65 6d  vfl[0]);.    mem
2fb80 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
2fb90 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c  l, pPage->aOvfl,
2fba0 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 70 43 68   nCopy);.    pCh
2fbb0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
2fbc0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2fbd0 77 3b 0a 20 20 20 20 69 66 28 20 70 43 68 69 6c  w;.    if( pChil
2fbe0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
2fbf0 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46        pChild->nF
2fc00 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ree = 0;.    }. 
2fc10 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
2fc20 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d  d->nCell==pPage-
2fc30 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 61 73  >nCell );.    as
2fc40 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2fc50 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2fc60 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2fc70 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
2fc80 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
2fc90 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
2fca0 46 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  F);.    put4byte
2fcb0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2fcc0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2fcd0 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
2fce0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2fcf0 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
2fd00 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50  d into %d\n", pP
2fd10 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  age->pgno, pChil
2fd20 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 69  d->pgno));.    i
2fd30 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2fd40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
2fd50 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68  rmapPut(pBt, pCh
2fd60 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  ild->pgno, PTRMA
2fd70 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e  P_BTREE, pPage->
2fd80 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
2fd90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2fda0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
2fdb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fdc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
2fdd0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 43  tChildPtrmaps(pC
2fde0 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  hild);.      }. 
2fdf0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2fe00 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e         pChild->n
2fe10 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
2fe20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2fe30 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
2fe40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fe50 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b     pCur->iPage++
2fe60 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
2fe70 67 65 5b 31 5d 20 3d 20 70 43 68 69 6c 64 3b 0a  ge[1] = pChild;.
2fe80 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2fe90 30 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  0] = 0;.    rc =
2fea0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
2feb0 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2fec0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2fed0 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20  (pChild);.  }.. 
2fee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2fef0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68  *.** The page th
2ff00 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c  at pCur currentl
2ff10 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  y points to has 
2ff20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69  just been modifi
2ff30 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61  ed in.** some wa
2ff40 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
2ff50 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20   figures out if 
2ff60 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f  this modificatio
2ff70 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74  n means the.** t
2ff80 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ree needs to be 
2ff90 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66  balanced, and if
2ffa0 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70   so calls the ap
2ffb0 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63  propriate balanc
2ffc0 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  ing .** routine.
2ffd0 0a 2a 2a 20 0a 2a 2a 20 50 61 72 61 6d 65 74 65  .** .** Paramete
2ffe0 72 20 69 73 49 6e 73 65 72 74 20 69 73 20 74 72  r isInsert is tr
2fff0 75 65 20 69 66 20 61 20 6e 65 77 20 63 65 6c 6c  ue if a new cell
30000 20 77 61 73 20 6a 75 73 74 20 69 6e 73 65 72 74   was just insert
30010 65 64 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 70  ed into the.** p
30020 61 67 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  age, or false ot
30030 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
30040 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42  ic int balance(B
30050 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
30060 6e 74 20 69 73 49 6e 73 65 72 74 29 7b 0a 20 20  nt isInsert){.  
30070 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30080 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
30090 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
300a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
300b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
300c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
300d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
300e0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  x) );.  if( pCur
300f0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
30100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30110 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
30120 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
30130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30140 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
30150 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  low>0 ){.      r
30160 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  c = balance_deep
30170 65 72 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  er(pCur);.      
30180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
30190 50 61 67 65 5b 30 5d 3d 3d 70 50 61 67 65 20 29  Page[0]==pPage )
301a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
301b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
301c0 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  ==0 || rc!=SQLIT
301d0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20  E_OK );.    }.  
301e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
301f0 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43  _OK && pPage->nC
30200 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ell==0 ){.      
30210 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61  rc = balance_sha
30220 6c 6c 6f 77 65 72 28 70 43 75 72 29 3b 0a 20 20  llower(pCur);.  
30230 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
30240 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 70 50 61  ->apPage[0]==pPa
30250 67 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge );.      asse
30260 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
30270 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63 21 3d 53  flow==0 || rc!=S
30280 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
30290 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
302a0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
302b0 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20  low>0 || .      
302c0 20 20 28 21 69 73 49 6e 73 65 72 74 20 26 26 20    (!isInsert && 
302d0 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61  pPage->nFree>pPa
302e0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
302f0 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20  ize*2/3) ){.    
30300 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
30310 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  onroot(pCur);.  
30320 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
30330 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
30340 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
30350 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68  s all cursors th
30360 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c  at point to tabl
30370 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49  e pgnoRoot..** I
30380 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63  f any of those c
30390 75 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e  ursors were open
303a0 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
303b0 30 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  0 in a different
303c0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
303d0 6e 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62  nection (a datab
303e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
303f0 68 61 74 20 73 68 61 72 65 73 20 74 68 65 20 70  hat shares the p
30400 61 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69  ager.** cache wi
30410 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  th the current c
30420 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74  onnection) and t
30430 68 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  hat other connec
30440 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  tion .** is not 
30450 69 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  in the ReadUncom
30460 6d 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20 74  mmitted state, t
30470 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
30480 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
30490 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a  ITE_LOCKED..**.*
304a0 2a 20 41 73 20 77 65 6c 6c 20 61 73 20 63 75 72  * As well as cur
304b0 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61 67  sors with wrFlag
304c0 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20 77 69 74  ==0, cursors wit
304d0 68 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f 62  h .** isIncrblob
304e0 48 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61 6c  Handle==1 are al
304f0 73 6f 20 63 6f 6e 73 69 64 65 72 65 64 20 27 72  so considered 'r
30500 65 61 64 27 20 63 75 72 73 6f 72 73 20 62 65 63  ead' cursors bec
30510 61 75 73 65 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e  ause.** incremen
30520 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  tal blob cursors
30530 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 62 6f   are used for bo
30540 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77  th reading and w
30550 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68  riting..**.** Wh
30560 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  en pgnoRoot is t
30570 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
30580 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  an intkey table,
30590 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
305a0 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e  s also.** respon
305b0 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69  sible for invali
305c0 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74  dating increment
305d0 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  al blob cursors 
305e0 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72  when the table r
305f0 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74  ow.** on which t
30600 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64 20 69  hey are opened i
30610 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64  s deleted or mod
30620 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73 20 61  ified. Cursors a
30630 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
30640 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  * according to t
30650 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c  he following rul
30660 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
30670 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72 54 61  hen BtreeClearTa
30680 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ble() is called 
30690 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65  to completely de
306a0 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lete the content
306b0 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 42  s.**      of a B
306c0 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70 45 78  -Tree table, pEx
306d0 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20  clude is set to 
306e0 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d 65 74  zero and paramet
306f0 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20  er iRow is .**  
30700 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a      set to non-z
30710 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
30720 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61  e all incrementa
30730 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  l blob cursors o
30740 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  pen.**      on t
30750 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
30760 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20  at pgnoRoot are 
30770 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
30780 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42 74 72  **   2) When Btr
30790 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74 72 65  eeInsert(), Btre
307a0 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
307b0 65 65 50 75 74 44 61 74 61 28 29 20 69 73 20 63  eePutData() is c
307c0 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20  alled to .**    
307d0 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62 6c 65    modify a table
307e0 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51 4c 20   row via an SQL 
307f0 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c  statement, pExcl
30800 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ude is set to th
30810 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69 74 65  e .**      write
30820 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
30830 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74  do the modificat
30840 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65 74 65  ion and paramete
30850 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a  r iRow is set.**
30860 20 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74        to the int
30870 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66 20 74  eger row id of t
30880 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72 79 20  he B-Tree entry 
30890 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20  being modified. 
308a0 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 70  Unless.**      p
308b0 45 78 63 6c 75 64 65 20 69 73 20 69 74 73 65 6c  Exclude is itsel
308c0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
308d0 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74 68   blob cursor, th
308e0 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  en all increment
308f0 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20  al.**      blob 
30900 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
30910 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68 65 20  row iRow of the 
30920 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76 61 6c  B-Tree are inval
30930 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
30940 33 29 20 49 66 20 62 6f 74 68 20 70 45 78 63 6c  3) If both pExcl
30950 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61 72 65  ude and iRow are
30960 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f   set to zero, no
30970 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
30980 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 73 6f  b .**      curso
30990 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
309a0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
309b0 74 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f  t checkForReadCo
309c0 6e 66 6c 69 63 74 73 28 0a 20 20 42 74 72 65 65  nflicts(.  Btree
309d0 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
309e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
309f0 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
30a00 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52   */.  Pgno pgnoR
30a10 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  oot,          /*
30a20 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61 64 20 63   Look for read c
30a30 75 72 73 6f 72 73 20 6f 6e 20 74 68 69 73 20 62  ursors on this b
30a40 74 72 65 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  tree */.  BtCurs
30a50 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 20 20 20  or *pExclude,   
30a60 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 69 73    /* Ignore this
30a70 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 36 34   cursor */.  i64
30a80 20 69 52 6f 77 20 20 20 20 20 20 20 20 20 20 20   iRow           
30a90 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
30aa0 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
30ab0 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 29 7b 0a 20  changing */.){. 
30ac0 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
30ad0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
30ae0 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73  pBtree->pBt;.  s
30af0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74  qlite3 *db = pBt
30b00 72 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  ree->db;.  asser
30b10 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
30b20 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
30b30 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
30b40 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
30b50 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
30b60 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29  f( p==pExclude )
30b70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
30b80 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d  f( p->pgnoRoot!=
30b90 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69  pgnoRoot ) conti
30ba0 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
30bb0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
30bc0 42 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  B.    if( p->isI
30bd0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
30be0 20 28 20 0a 20 20 20 20 20 20 20 20 20 28 21 70   ( .         (!p
30bf0 45 78 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29  Exclude && iRow)
30c00 0a 20 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c  .      || (pExcl
30c10 75 64 65 20 26 26 20 21 70 45 78 63 6c 75 64 65  ude && !pExclude
30c20 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
30c30 6c 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b  le && p->info.nK
30c40 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29  ey==iRow).    ))
30c50 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
30c60 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
30c70 49 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ID;.    }.#endif
30c80 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61  .    if( p->eSta
30c90 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
30ca0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
30cb0 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d   if( p->wrFlag==
30cc0 30 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0 .#ifndef SQLIT
30cd0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
30ce0 20 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63       || p->isInc
30cf0 72 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64  rblobHandle.#end
30d00 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  if.    ){.      
30d10 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72  sqlite3 *dbOther
30d20 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62   = p->pBtree->db
30d30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 64  ;.      assert(d
30d40 62 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 69  bOther);.      i
30d50 66 28 20 64 62 4f 74 68 65 72 21 3d 64 62 20 26  f( dbOther!=db &
30d60 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67  & (dbOther->flag
30d70 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
30d80 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 20 29  ncommitted)==0 )
30d90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30da0 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
30db0 65 64 28 64 62 2c 20 64 62 4f 74 68 65 72 29 3b  ed(db, dbOther);
30dc0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
30dd0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
30de0 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20  AREDCACHE;.     
30df0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
30e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
30e20 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
30e30 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54  to the BTree.  T
30e40 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20  he key is given 
30e50 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a  by (pKey,nKey).*
30e60 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69  * and the data i
30e70 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74  s given by (pDat
30e80 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63  a,nData).  The c
30e90 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e  ursor is used on
30ea0 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20  ly to.** define 
30eb0 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72  what table the r
30ec0 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
30ed0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20  inserted into.  
30ee0 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
30ef0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
30f00 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74  t a random locat
30f10 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ion..**.** For a
30f20 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20  n INTKEY table, 
30f30 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61  only the nKey va
30f40 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69  lue of the key i
30f50 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
30f60 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
30f70 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62  r a ZERODATA tab
30f80 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e  le, the pData an
30f90 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68  d nData are both
30fa0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
30fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
30fc0 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ert(.  BtCursor 
30fd0 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
30fe0 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
30ff0 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61  data into the ta
31000 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73  ble of this curs
31010 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  or */.  const vo
31020 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
31030 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
31040 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  y of the new rec
31050 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
31060 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
31070 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64  nData,  /* The d
31080 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72  ata of the new r
31090 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
310a0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
310b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
310c0 62 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62  ber of extra 0 b
310d0 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
310e0 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  o data */.  int 
310f0 61 70 70 65 6e 64 42 69 61 73 20 20 20 20 20 20  appendBias      
31100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
31110 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69  ue if this is li
31120 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a  kely an append *
31130 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
31140 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20   int loc;.  int 
31150 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78  szNew;.  int idx
31160 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
31170 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  ge;.  Btree *p =
31180 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
31190 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
311a0 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
311b0 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c  ned char *oldCel
311c0 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  l;.  unsigned ch
311d0 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b  ar *newCell = 0;
311e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
311f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
31200 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
31210 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
31220 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
31230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  );.  assert( !pB
31240 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
31250 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77   assert( pCur->w
31260 72 46 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20  rFlag );.  rc = 
31270 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66  checkForReadConf
31280 6c 69 63 74 73 28 70 43 75 72 2d 3e 70 42 74 72  licts(pCur->pBtr
31290 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ee, pCur->pgnoRo
312a0 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 3b  ot, pCur, nKey);
312b0 0a 20 20 69 66 28 20 72 63 20 29 7b 20 20 20 20  .  if( rc ){    
312c0 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a           .    /*
312d0 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
312e0 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
312f0 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
31300 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
31310 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
31320 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65  DCACHE );.    re
31330 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
31340 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
31350 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
31360 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
31370 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ->skip;.  }..  /
31380 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
31390 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
313a0 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  r cursors open o
313b0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  n this table */.
313c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
313d0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
313e0 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49  .  if( .    SQLI
313f0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
31400 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
31410 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
31420 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53   pCur)) ||.    S
31430 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
31440 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
31450 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e  to(pCur, pKey, n
31460 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c  Key, appendBias,
31470 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20   &loc)).  ){.   
31480 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
31490 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
314a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
314b0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
314c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
314d0 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
314e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
314f0 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74  f || !pPage->int
31500 4b 65 79 20 29 3b 0a 20 20 54 52 41 43 45 28 28  Key );.  TRACE((
31510 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25  "INSERT: table=%
31520 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74  d nkey=%lld ndat
31530 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c  a=%d page=%d %s\
31540 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  n",.          pC
31550 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b  ur->pgnoRoot, nK
31560 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65  ey, nData, pPage
31570 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
31580 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72    loc==0 ? "over
31590 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e  write" : "new en
315a0 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74  try"));.  assert
315b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
315c0 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  );.  allocateTem
315d0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e  pSpace(pBt);.  n
315e0 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  ewCell = pBt->pT
315f0 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e  mpSpace;.  if( n
31600 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  ewCell==0 ) retu
31610 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
31620 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
31630 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  ll(pPage, newCel
31640 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  l, pKey, nKey, p
31650 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65  Data, nData, nZe
31660 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69  ro, &szNew);.  i
31670 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
31680 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72  _insert;.  asser
31690 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69  t( szNew==cellSi
316a0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77  zePtr(pPage, new
316b0 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
316c0 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c  t( szNew<=MX_CEL
316d0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
316e0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
316f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
31700 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26  .  if( loc==0 &&
31710 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
31720 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
31730 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20     u16 szOld;.  
31740 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50    assert( idx<pP
31750 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
31760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31770 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
31780 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
31790 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  ( rc ){.      go
317a0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
317b0 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c     }.    oldCell
317c0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
317d0 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28  e, idx);.    if(
317e0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
317f0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
31800 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
31810 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
31820 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
31830 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
31840 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
31850 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
31860 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
31870 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
31880 65 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 64 72  ert;.    rc = dr
31890 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  opCell(pPage, id
318a0 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69  x, szOld);.    i
318b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
318c0 20 29 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20   ) {.      goto 
318d0 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
318e0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  }.  }else if( lo
318f0 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43  c<0 && pPage->nC
31900 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ell>0 ){.    ass
31910 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
31920 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b   );.    idx = ++
31930 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
31940 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 70 43  ->iPage];.    pC
31950 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
31960 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
31970 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
31980 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
31990 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
319a0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65  .  }.  rc = inse
319b0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  rtCell(pPage, id
319c0 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65  x, newCell, szNe
319d0 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
319e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
319f0 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
31a00 65 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 7d 0a  e(pCur, 1);.  }.
31a10 0a 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20  .  /* Must make 
31a20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69  sure nOverflow i
31a30 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20  s reset to zero 
31a40 65 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61  even if the bala
31a50 6e 63 65 28 29 0a 20 20 2a 2a 20 66 61 69 6c 73  nce().  ** fails
31a60 2e 20 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61  .  Internal data
31a70 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
31a80 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ption will resul
31a90 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a  t otherwise. */.
31aa0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
31ab0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
31ac0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 69  erflow = 0;..  i
31ad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31ae0 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
31af0 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e  ot(pCur);.  }.en
31b00 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75  d_insert:.  retu
31b10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
31b20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
31b30 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
31b40 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
31b50 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
31b60 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
31b70 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20   at a arbitrary 
31b80 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  location..*/.int
31b90 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
31ba0 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ete(BtCursor *pC
31bb0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
31bc0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
31bd0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
31be0 5d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  ];.  int idx;.  
31bf0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
31c00 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cell;.  int rc;.
31c10 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
31c20 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a 70   = 0;.  Btree *p
31c30 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
31c40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
31c50 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
31c60 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
31c70 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
31c80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
31c90 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
31ca0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
31cb0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
31cc0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
31cd0 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
31ce0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
31cf0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
31d00 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
31d10 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
31d20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70   }.  if( NEVER(p
31d30 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
31d40 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
31d50 6e 43 65 6c 6c 29 20 29 7b 0a 20 20 20 20 72 65  nCell) ){.    re
31d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
31d70 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  R;  /* The curso
31d80 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
31d90 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f  g to anything */
31da0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
31db0 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20  Cur->wrFlag );. 
31dc0 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65   rc = checkForRe
31dd0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70  adConflicts(p, p
31de0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
31df0 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  Cur, pCur->info.
31e00 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 72 63 21  nKey);.  if( rc!
31e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31e20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70    /* The table p
31e30 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
31e40 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
31e50 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
31e60 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  =SQLITE_LOCKED_S
31e70 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20  HAREDCACHE );.  
31e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
31e90 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74  ..  /* Restore t
31ea0 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
31eb0 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f  r position (a no
31ec0 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72 73 6f  -op if the curso
31ed0 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a  r is not in .  *
31ee0 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  * CURSOR_REQUIRE
31ef0 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20  SEEK state) and 
31f00 73 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  save the positio
31f10 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
31f20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70  cursors .  ** op
31f30 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  en on the same t
31f40 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20  able. Then call 
31f50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31f60 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  e() on the page.
31f70 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e    ** that the en
31f80 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  try will be dele
31f90 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20  ted from..  */. 
31fa0 20 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20   if( .    (rc = 
31fb0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
31fc0 69 74 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20  ition(pCur))!=0 
31fd0 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76  ||.    (rc = sav
31fe0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
31ff0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
32000 20 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20   pCur))!=0 ||.  
32010 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50    (rc = sqlite3P
32020 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
32030 3e 70 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20  >pDbPage))!=0.  
32040 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
32050 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
32060 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  te the cell with
32070 69 6e 20 69 74 73 20 70 61 67 65 20 61 6e 64 20  in its page and 
32080 6c 65 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e  leave pCell poin
32090 74 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ting to the.  **
320a0 20 64 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72   data. The clear
320b0 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65  Cell() call free
320c0 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  s any overflow p
320d0 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
320e0 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65  with the.  ** ce
320f0 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73  ll. The cell its
32100 65 6c 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74  elf is still int
32110 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 64 78 20  act..  */.  idx 
32120 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
32130 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 70 43  ur->iPage];.  pC
32140 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
32150 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 69 66  Page, idx);.  if
32160 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
32170 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  {.    pgnoChild 
32180 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
32190 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
321a0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
321b0 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  Cell);.  if( rc 
321c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
321d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
321e0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
321f0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65   /*.    ** The e
32200 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f 75  ntry we are abou
32210 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e  t to delete is n
32220 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20  ot a leaf so if 
32230 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  we do not.    **
32240 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65   do something we
32250 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f   will leave a ho
32260 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61  le on an interna
32270 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57  l page..    ** W
32280 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74  e have to fill t
32290 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e  he hole by movin
322a0 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d  g in a cell from
322b0 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20   a leaf.  The.  
322c0 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61    ** next Cell a
322d0 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20  fter the one to 
322e0 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67 75  be deleted is gu
322f0 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
32300 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20  t and.    ** to 
32310 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20  be a leaf so we 
32320 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  can use it..    
32330 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  */.    BtCursor 
32340 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 4d 65 6d  leafCur;.    Mem
32350 50 61 67 65 20 2a 70 4c 65 61 66 50 61 67 65 20  Page *pLeafPage 
32360 3d 20 30 3b 0a 0a 20 20 20 20 75 6e 73 69 67 6e  = 0;..    unsign
32370 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a  ed char *pNext;.
32380 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b      int notUsed;
32390 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
323a0 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30  ar *tempCell = 0
323b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
323c0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Page->intKey );.
323d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
323e0 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43  GetTempCursor(pC
323f0 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20  ur, &leafCur);. 
32400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
32410 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75  treeNext(&leafCu
32420 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
32430 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32440 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
32450 65 72 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49  ert( leafCur.aiI
32460 64 78 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65  dx[leafCur.iPage
32470 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c  ]==0 );.      pL
32480 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75  eafPage = leafCu
32490 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72  r.apPage[leafCur
324a0 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 72  .iPage];.      r
324b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
324c0 57 72 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d  Write(pLeafPage-
324d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
324e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
324f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32500 69 6e 74 20 6c 65 61 66 43 75 72 73 6f 72 49 6e  int leafCursorIn
32510 76 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  valid = 0;.     
32520 20 75 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20   u16 szNext;.   
32530 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
32540 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
32550 74 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d  te internal from
32560 20 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d   %d replace from
32570 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
32580 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
32590 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
325a0 6f 2c 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67  o, pLeafPage->pg
325b0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70  no));.      drop
325c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
325d0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
325e0 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
325f0 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43     pNext = findC
32600 65 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30  ell(pLeafPage, 0
32610 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20  );.      szNext 
32620 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c  = cellSizePtr(pL
32630 65 61 66 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  eafPage, pNext);
32640 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
32650 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
32660 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
32670 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
32680 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
32690 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74    tempCell = pBt
326a0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
326b0 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d     if( tempCell=
326c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
326d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
326e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
326f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32700 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
32710 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
32720 65 2c 20 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c  e, idx, pNext-4,
32730 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43   szNext+4, tempC
32740 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ell, 0);.      }
32750 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ...      /* The 
32760 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20 69  "if" statement i
32770 6e 20 74 68 65 20 6e 65 78 74 20 63 6f 64 65 20  n the next code 
32780 62 6c 6f 63 6b 20 69 73 20 63 72 69 74 69 63 61  block is critica
32790 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  l.  The.      **
327a0 20 73 6c 69 67 68 74 65 73 74 20 65 72 72 6f 72   slightest error
327b0 20 69 6e 20 74 68 61 74 20 73 74 61 74 65 6d 65   in that stateme
327c0 6e 74 20 77 6f 75 6c 64 20 61 6c 6c 6f 77 20 53  nt would allow S
327d0 51 4c 69 74 65 20 74 6f 20 6f 70 65 72 61 74 65  QLite to operate
327e0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  .      ** correc
327f0 74 6c 79 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  tly most of the 
32800 74 69 6d 65 20 62 75 74 20 70 72 6f 64 75 63 65  time but produce
32810 20 76 65 72 79 20 72 61 72 65 20 66 61 69 6c 75   very rare failu
32820 72 65 73 2e 20 20 54 6f 0a 20 20 20 20 20 20 2a  res.  To.      *
32830 2a 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  * guard against 
32840 74 68 69 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  this, the follow
32850 69 6e 67 20 6d 61 63 72 6f 73 20 68 65 6c 70 20  ing macros help 
32860 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 0a 20  to verify that. 
32870 20 20 20 20 20 2a 2a 20 74 68 65 20 22 69 66 22       ** the "if"
32880 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 77 65   statement is we
32890 6c 6c 20 74 65 73 74 65 64 2e 0a 20 20 20 20 20  ll tested..     
328a0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
328b0 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  se( pPage->nOver
328c0 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
328d0 2d 3e 6e 46 72 65 65 3c 70 42 74 2d 3e 75 73 61  ->nFree<pBt->usa
328e0 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20  bleSize*2/3 .   
328f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
32900 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
32910 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74  e+2+szNext > pBt
32920 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
32930 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
32940 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  se( pPage->nOver
32950 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
32960 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73  ->nFree==pBt->us
32970 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20  ableSize*2/3 .  
32980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
32990 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72  & pLeafPage->nFr
329a0 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42  ee+2+szNext > pB
329b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
329c0 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  3 );.      testc
329d0 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ase( pPage->nOve
329e0 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67  rflow==0 && pPag
329f0 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75  e->nFree==pBt->u
32a00 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20  sableSize*2/3+1 
32a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32a20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e    && pLeafPage->
32a30 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e  nFree+2+szNext >
32a40 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
32a50 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65  *2/3 );.      te
32a60 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
32a70 4f 76 65 72 66 6c 6f 77 3e 30 20 26 26 20 70 50  Overflow>0 && pP
32a80 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 70 42 74 2d  age->nFree<=pBt-
32a90 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 0a  >usableSize*2/3.
32aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ab0 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e   && pLeafPage->n
32ac0 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20  Free+2+szNext > 
32ad0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
32ae0 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73  2/3 );.      tes
32af0 74 63 61 73 65 28 20 28 70 50 61 67 65 2d 3e 6e  tcase( (pPage->n
32b00 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70  Overflow>0 || (p
32b10 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42  Page->nFree > pB
32b20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
32b30 33 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  3)).            
32b40 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67       && pLeafPag
32b50 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
32b60 74 20 3d 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  t == pBt->usable
32b70 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 0a 0a 20 20  Size*2/3 );...  
32b80 20 20 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e      if( (pPage->
32b90 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28  nOverflow>0 || (
32ba0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70  pPage->nFree > p
32bb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
32bc0 2f 33 29 29 20 26 26 0a 20 20 20 20 20 20 20 20  /3)) &&.        
32bd0 20 20 28 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46    (pLeafPage->nF
32be0 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70  ree+2+szNext > p
32bf0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
32c00 2f 33 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  /3).      ){.   
32c10 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
32c20 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
32c30 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
32c40 65 20 69 73 20 6e 6f 77 20 65 69 74 68 65 72 20  e is now either 
32c50 6f 76 65 72 66 6c 6f 77 69 6e 67 0a 20 20 20 20  overflowing.    
32c60 20 20 20 20 2a 2a 20 6f 72 20 75 6e 64 65 72 66      ** or underf
32c70 75 6c 6c 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ull and the leaf
32c80 20 6e 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 6e   node will be un
32c90 64 65 72 66 75 6c 6c 20 61 66 74 65 72 20 74 68  derfull after th
32ca0 65 20 6a 75 73 74 20 63 65 6c 6c 20 0a 20 20 20  e just cell .   
32cb0 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 74       ** copied t
32cc0 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  o the internal n
32cd0 6f 64 65 20 69 73 20 64 65 6c 65 74 65 64 20 66  ode is deleted f
32ce0 72 6f 6d 20 69 74 2e 20 54 68 69 73 20 69 73 20  rom it. This is 
32cf0 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20  a special.      
32d00 20 20 2a 2a 20 63 61 73 65 20 62 65 63 61 75 73    ** case becaus
32d10 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 61  e the call to ba
32d20 6c 61 6e 63 65 28 29 20 74 6f 20 63 6f 72 72 65  lance() to corre
32d30 63 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ct the internal 
32d40 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  node.        ** 
32d50 6d 61 79 20 63 68 61 6e 67 65 20 74 68 65 20 74  may change the t
32d60 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
32d70 64 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  d invalidate the
32d80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 20 20 20   contents of.   
32d90 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66       ** the leaf
32da0 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
32db0 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d   leafCur.aiIdx[]
32dc0 20 61 72 72 61 79 73 2c 20 77 68 69 63 68 20 77   arrays, which w
32dd0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
32de0 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 62 61  * used by the ba
32df0 6c 61 6e 63 65 28 29 20 72 65 71 75 69 72 65 64  lance() required
32e00 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20   to correct the 
32e10 75 6e 64 65 72 66 75 6c 6c 20 6c 65 61 66 0a 20  underfull leaf. 
32e20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 2e 0a         ** node..
32e30 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
32e40 20 20 20 2a 2a 20 54 68 65 20 66 6f 72 6d 75 6c     ** The formul
32e50 61 20 75 73 65 64 20 69 6e 20 74 68 65 20 65 78  a used in the ex
32e60 70 72 65 73 73 69 6f 6e 20 61 62 6f 76 65 20 61  pression above a
32e70 72 65 20 62 61 73 65 64 20 6f 6e 20 66 61 63 65  re based on face
32e80 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ts of.        **
32e90 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
32ea0 2d 66 6f 72 6d 61 74 20 74 68 61 74 20 64 6f 20  -format that do 
32eb0 6e 6f 74 20 63 68 61 6e 67 65 20 6f 76 65 72 20  not change over 
32ec0 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  time..        */
32ed0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
32ee0 65 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d  e( pPage->nFree=
32ef0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
32f00 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20  *2/3+1 );.      
32f10 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 61    testcase( pLea
32f20 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
32f30 7a 4e 65 78 74 3d 3d 70 42 74 2d 3e 75 73 61 62  zNext==pBt->usab
32f40 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a  leSize*2/3+1 );.
32f50 20 20 20 20 20 20 20 20 6c 65 61 66 43 75 72 73          leafCurs
32f60 6f 72 49 6e 76 61 6c 69 64 20 3d 20 31 3b 0a 20  orInvalid = 1;. 
32f70 20 20 20 20 20 7d 20 20 20 20 20 20 20 20 0a 0a       }        ..
32f80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32f90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32fa0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
32fb0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
32fc0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
32fd0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  e) );.        pu
32fe0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
32ff0 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  lowCell(pPage, i
33000 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  dx), pgnoChild);
33010 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  .        VVA_ONL
33020 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  Y( pCur->pagesSh
33030 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20  uffled = 0 );.  
33040 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
33050 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  ce(pCur, 0);.   
33060 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
33070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
33080 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c   leafCursorInval
33090 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  id ){.        /*
330a0 20 54 68 65 20 6c 65 61 66 2d 6e 6f 64 65 20 69   The leaf-node i
330b0 73 20 6e 6f 77 20 75 6e 64 65 72 66 75 6c 6c 20  s now underfull 
330c0 61 6e 64 20 73 6f 20 74 68 65 20 74 72 65 65 20  and so the tree 
330d0 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
330e0 20 20 20 20 20 2a 2a 20 72 65 62 61 6c 61 6e 63       ** rebalanc
330f0 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65  ed. However, the
33100 20 62 61 6c 61 6e 63 65 28 29 20 6f 70 65 72 61   balance() opera
33110 74 69 6f 6e 20 6f 6e 20 74 68 65 20 69 6e 74 65  tion on the inte
33120 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
33130 6e 6f 64 65 20 61 62 6f 76 65 20 6d 61 79 20 68  node above may h
33140 61 76 65 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ave modified the
33150 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 68   structure of th
33160 65 20 42 2d 54 72 65 65 20 61 6e 64 0a 20 20 20  e B-Tree and.   
33170 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 65 20 63       ** so the c
33180 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
33190 6f 66 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67  of leafCur.apPag
331a0 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e  e[] and leafCur.
331b0 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20 20 20  aiIdx[].        
331c0 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  ** may not be tr
331d0 75 73 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  usted..        *
331e0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  *.        ** It 
331f0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
33200 74 6f 20 63 6f 70 79 20 74 68 65 20 61 6e 63 65  to copy the ance
33210 73 74 72 79 20 66 72 6f 6d 20 70 43 75 72 2c 20  stry from pCur, 
33220 61 73 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  as the same.    
33230 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 28 29      ** balance()
33240 20 63 61 6c 6c 20 68 61 73 20 69 6e 76 61 6c 69   call has invali
33250 64 61 74 65 64 20 74 68 65 20 70 43 75 72 2d 3e  dated the pCur->
33260 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49  apPage[] and aiI
33270 64 78 5b 5d 0a 20 20 20 20 20 20 20 20 2a 2a 20  dx[].        ** 
33280 61 72 72 61 79 73 2e 20 0a 20 20 20 20 20 20 20  arrays. .       
33290 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
332a0 68 65 20 63 61 6c 6c 20 74 6f 20 73 61 76 65 43  he call to saveC
332b0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
332c0 62 65 6c 6f 77 20 69 6e 74 65 72 6e 61 6c 6c 79  below internally
332d0 20 73 61 76 65 73 20 74 68 65 20 0a 20 20 20 20   saves the .    
332e0 20 20 20 20 2a 2a 20 6b 65 79 20 74 68 61 74 20      ** key that 
332f0 6c 65 61 66 43 75 72 20 69 73 20 63 75 72 72 65  leafCur is curre
33300 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
33310 2e 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 65  . Currently, the
33320 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72  re.        ** ar
33330 65 20 74 77 6f 20 63 6f 70 69 65 73 20 6f 66 20  e two copies of 
33340 74 68 61 74 20 6b 65 79 20 69 6e 20 74 68 65 20  that key in the 
33350 74 72 65 65 20 2d 20 6f 6e 65 20 68 65 72 65 20  tree - one here 
33360 6f 6e 20 74 68 65 20 6c 65 61 66 0a 20 20 20 20  on the leaf.    
33370 20 20 20 20 2a 2a 20 70 61 67 65 20 61 6e 64 20      ** page and 
33380 6f 6e 65 20 6f 6e 20 73 6f 6d 65 20 69 6e 74 65  one on some inte
33390 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 74 68 65  rnal node in the
333a0 20 74 72 65 65 2e 20 54 68 65 20 63 6f 70 79 20   tree. The copy 
333b0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
333c0 65 20 6c 65 61 66 20 6e 6f 64 65 20 69 73 20 61  e leaf node is a
333d0 6c 77 61 79 73 20 74 68 65 20 6e 65 78 74 20 6b  lways the next k
333e0 65 79 20 69 6e 20 74 72 65 65 2d 6f 72 64 65 72  ey in tree-order
333f0 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
33400 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 6e 20 74      ** copy on t
33410 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
33420 2e 20 53 6f 2c 20 74 68 65 20 63 61 6c 6c 20 74  . So, the call t
33430 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
33440 78 74 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  xt().        ** 
33450 63 61 6c 6c 73 20 72 65 73 74 6f 72 65 43 75 72  calls restoreCur
33460 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 74 6f  sorPosition() to
33470 20 70 6f 69 6e 74 20 74 68 65 20 63 75 72 73 6f   point the curso
33480 72 20 74 6f 20 74 68 65 20 63 6f 70 79 0a 20 20  r to the copy.  
33490 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
334a0 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  on the internal 
334b0 6e 6f 64 65 2c 20 74 68 65 6e 20 61 64 76 61 6e  node, then advan
334c0 63 65 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ces to the next 
334d0 65 6e 74 72 79 2c 0a 20 20 20 20 20 20 20 20 2a  entry,.        *
334e0 2a 20 77 68 69 63 68 20 68 61 70 70 65 6e 73 20  * which happens 
334f0 74 6f 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  to be the copy o
33500 66 20 74 68 65 20 6b 65 79 20 6f 6e 20 74 68 65  f the key on the
33510 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a   internal node..
33520 20 20 20 20 20 20 20 20 2a 2a 20 4e 65 74 20 65          ** Net e
33530 66 66 65 63 74 3a 20 6c 65 61 66 43 75 72 20 69  ffect: leafCur i
33540 73 20 70 6f 69 6e 74 69 6e 67 20 62 61 63 6b 20  s pointing back 
33550 74 6f 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  to the duplicate
33560 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   cell.        **
33570 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
33580 65 20 72 65 6d 6f 76 65 64 2c 20 61 6e 64 20 74  e removed, and t
33590 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67  he leafCur.apPag
335a0 65 5b 5d 20 61 6e 64 0a 20 20 20 20 20 20 20 20  e[] and.        
335b0 2a 2a 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78  ** leafCur.aiIdx
335c0 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20 63 6f  [] arrays are co
335d0 72 72 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  rrect..        *
335e0 2f 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e  /.        VVA_ON
335f0 4c 59 28 20 50 67 6e 6f 20 6c 65 61 66 50 67 6e  LY( Pgno leafPgn
33600 6f 20 3d 20 70 4c 65 61 66 50 61 67 65 2d 3e 70  o = pLeafPage->p
33610 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 72  gno );.        r
33620 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
33630 73 69 74 69 6f 6e 28 26 6c 65 61 66 43 75 72 29  sition(&leafCur)
33640 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
33650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33660 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
33670 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26  lite3BtreeNext(&
33680 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65  leafCur, &notUse
33690 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
336a0 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20        pLeafPage 
336b0 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  = leafCur.apPage
336c0 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b  [leafCur.iPage];
336d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
336e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
336f0 7c 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e  | pLeafPage->pgn
33700 6f 3d 3d 6c 65 61 66 50 67 6e 6f 20 29 3b 0a 20  o==leafPgno );. 
33710 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
33720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
33730 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 6c 65  leafCur.aiIdx[le
33740 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20  afCur.iPage]==0 
33750 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
33760 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
33770 3d 72 63 0a 20 20 20 20 20 20 20 26 26 20 53 51  =rc.       && SQ
33780 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
33790 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
337a0 28 70 4c 65 61 66 50 61 67 65 2d 3e 70 44 62 50  (pLeafPage->pDbP
337b0 61 67 65 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  age)) .      ){.
337c0 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
337d0 28 70 4c 65 61 66 50 61 67 65 2c 20 30 2c 20 73  (pLeafPage, 0, s
337e0 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zNext);.        
337f0 56 56 41 5f 4f 4e 4c 59 28 20 6c 65 61 66 43 75  VVA_ONLY( leafCu
33800 72 2e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  r.pagesShuffled 
33810 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  = 0 );.        r
33820 63 20 3d 20 62 61 6c 61 6e 63 65 28 26 6c 65 61  c = balance(&lea
33830 66 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  fCur, 0);.      
33840 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 75    assert( leafCu
33850 72 73 6f 72 49 6e 76 61 6c 69 64 20 7c 7c 20 21  rsorInvalid || !
33860 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53 68 75  leafCur.pagesShu
33870 66 66 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20  ffled.          
33880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33890 20 20 20 20 20 20 20 20 20 7c 7c 20 21 70 43 75           || !pCu
338a0 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64  r->pagesShuffled
338b0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
338c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
338d0 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
338e0 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20  sor(&leafCur);. 
338f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43   }else{.    TRAC
33900 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
33910 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d  e=%d delete from
33920 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
33930 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
33940 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ot, pPage->pgno)
33950 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70  );.    rc = drop
33960 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
33970 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
33980 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
33990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
339a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
339b0 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30   balance(pCur, 0
339c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
339d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
339e0 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
339f0 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ot(pCur);.  }.  
33a00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33a10 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
33a20 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
33a30 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
33a40 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
33a50 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
33a60 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
33a70 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
33a80 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
33a90 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
33aa0 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
33ab0 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
33ac0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
33ad0 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
33ae0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
33af0 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
33b00 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
33b10 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
33b20 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
33b30 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
33b40 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
33b50 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
33b60 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
33b70 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
33b80 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
33b90 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
33ba0 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74   indices.*/.stat
33bb0 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61  ic int btreeCrea
33bc0 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
33bd0 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
33be0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74  int flags){.  Bt
33bf0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
33c00 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
33c10 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
33c20 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
33c30 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
33c40 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
33c50 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
33c60 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
33c70 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
33c80 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
33c90 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
33ca0 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
33cb0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33cc0 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  UM.  rc = alloca
33cd0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
33ce0 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
33cf0 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28  ot, 1, 0);.  if(
33d00 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
33d10 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  n rc;.  }.#else.
33d20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
33d30 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
33d40 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
33d50 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
33d60 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  here to make roo
33d70 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  m for the root-p
33d80 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  age */.    MemPa
33d90 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f  ge *pPageMove; /
33da0 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f  * The page to mo
33db0 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f  ve to. */..    /
33dc0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77  * Creating a new
33dd0 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61   table may proba
33de0 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  bly require movi
33df0 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64  ng an existing d
33e00 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74  atabase.    ** t
33e10 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
33e20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72  the new tables r
33e30 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73  oot page. In cas
33e40 65 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e  e this page turn
33e50 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  s.    ** out to 
33e60 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
33e70 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20  age, delete all 
33e80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61  overflow page-ma
33e90 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20  p caches.    ** 
33ea0 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72  held by open cur
33eb0 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sors..    */.   
33ec0 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
33ed0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
33ee0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
33ef0 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
33f00 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
33f10 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
33f20 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
33f30 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
33f40 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
33f50 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
33f60 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
33f70 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
33f80 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
33f90 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
33fa0 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
33fb0 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
33fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
33fd0 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
33fe0 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
33ff0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
34010 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
34020 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20   pgnoRoot++;..  
34030 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f    /* The new roo
34040 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  t-page may not b
34050 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61  e allocated on a
34060 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
34070 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e, or the.    **
34080 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61   PENDING_BYTE pa
34090 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ge..    */.    w
340a0 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d  hile( pgnoRoot==
340b0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
340c0 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  t, pgnoRoot) ||.
340d0 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
340e0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
340f0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
34100 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
34110 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
34120 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
34130 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
34140 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
34150 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
34160 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
34170 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
34180 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
34190 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
341a0 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
341b0 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
341c0 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
341d0 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
341e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
341f0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
34200 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f  ge(pBt, &pPageMo
34210 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70  ve, &pgnoMove, p
34220 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20  gnoRoot, 1);.   
34230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
34250 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
34260 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d    if( pgnoMove!=
34270 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
34280 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73    /* pgnoRoot is
34290 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77   the page that w
342a0 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
342b0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
342c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
342d0 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e  w table (assumin
342e0 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e  g an error did n
342f0 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77  ot occur). But w
34300 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20  e were.      ** 
34310 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f  allocated pgnoMo
34320 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20  ve. If required 
34330 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20  (i.e. if it was 
34340 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  not allocated.  
34350 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64      ** by extend
34360 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74  ing the file), t
34370 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
34380 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f  at position pgno
34390 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Move.      ** is
343a0 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c   already journal
343b0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
343c0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
343d0 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
343e0 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
343f0 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
34400 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
34410 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
34420 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74  ly at pgnoRoot t
34430 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20  o pgnoMove. */. 
34440 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34450 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
34460 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
34470 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  oot, 0);.      i
34480 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
344a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
344b0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
344c0 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Get(pBt, pgnoRoo
344d0 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  t, &eType, &iPtr
344e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
344f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
34500 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
34510 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70  ROOTPAGE || eTyp
34520 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
34530 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  GE ){.        re
34540 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
34550 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
34560 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
34570 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
34580 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
34590 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
345a0 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
345b0 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20  _FREEPAGE );.   
345c0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
345d0 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c  Page(pBt, pRoot,
345e0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
345f0 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a  , pgnoMove, 0);.
34600 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34610 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20  e(pRoot);..     
34620 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70   /* Obtain the p
34630 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  age at pgnoRoot 
34640 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  */.      if( rc!
34650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34660 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
34670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
34680 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
34690 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
346a0 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
346b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
346c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
346d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
346e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
346f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34700 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
34710 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
34720 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34730 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
34740 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
34750 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
34760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
34770 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
34780 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
34790 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
347a0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
347b0 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
347c0 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
347d0 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
347e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
347f0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
34800 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
34810 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
34820 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
34830 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
34840 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
34850 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
34860 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
34870 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
34880 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
34890 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
348a0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
348b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
348c0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
348d0 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
348e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
348f0 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
34900 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
34910 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
34920 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
34930 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34940 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34950 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
34960 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
34970 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50  pRoot, flags | P
34980 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69  TF_LEAF);.  sqli
34990 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52  te3PagerUnref(pR
349a0 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
349b0 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74   *piTable = (int
349c0 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74  )pgnoRoot;.  ret
349d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
349e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
349f0 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
34a00 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
34a10 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
34a20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
34a30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
34a40 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
34a50 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69  reateTable(p, pi
34a60 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Table, flags);. 
34a70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
34a80 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
34a90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
34aa0 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
34ab0 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
34ac0 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
34ad0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
34ae0 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
34af0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
34b00 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
34b10 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
34b20 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
34b30 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
34b40 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
34b50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
34b60 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
34b70 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
34b80 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69   to clear */.  i
34b90 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c  nt freePageFlag,
34ba0 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61       /* Dealloca
34bb0 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20  te page if true 
34bc0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e  */.  int *pnChan
34bd0 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ge.){.  MemPage 
34be0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
34bf0 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
34c00 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
34c10 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
34c20 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
34c30 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
34c40 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70   );.  if( pgno>p
34c50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
34c60 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
34c70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34c80 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  BKPT;.  }..  rc 
34c90 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
34ca0 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
34cb0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
34cc0 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
34cd0 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
34ce0 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
34cf0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
34d00 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
34d10 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
34d20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
34d30 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
34d40 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
34d50 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
34d60 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61  pCell), 1, pnCha
34d70 6e 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nge);.      if( 
34d80 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
34d90 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
34da0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
34db0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
34dc0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
34dd0 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
34de0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
34df0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
34e00 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
34e10 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
34e20 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
34e30 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
34e40 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61  ta[8]), 1, pnCha
34e50 6e 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nge);.    if( rc
34e60 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
34e70 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
34e80 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61   }else if( pnCha
34e90 6e 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nge ){.    asser
34ea0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
34eb0 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67   );.    *pnChang
34ec0 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e += pPage->nCel
34ed0 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  l;.  }.  if( fre
34ee0 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20  ePageFlag ){.   
34ef0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
34f00 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Page);.  }else i
34f10 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
34f20 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
34f30 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29  ->pDbPage))==0 )
34f40 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  {.    zeroPage(p
34f50 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61  Page, pPage->aDa
34f60 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46  ta[0] | PTF_LEAF
34f70 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74  );.  }..cleardat
34f80 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20  abasepage_out:. 
34f90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
34fa0 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
34fb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
34fc0 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
34fd0 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  n from a single 
34fe0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
34ff0 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69  abase.  iTable i
35000 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  s.** the page nu
35010 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  mber of the root
35020 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
35030 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
35040 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74  ne returns,.** t
35050 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
35060 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c  empty, but still
35070 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54   exists..**.** T
35080 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
35090 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
350a0 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
350b0 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
350c0 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f  * read cursors o
350d0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70  n the table.  Op
350e0 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  en write cursors
350f0 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
35100 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65  e.** root of the
35110 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
35120 20 70 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74   pnChange is not
35130 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c   NULL, then tabl
35140 65 20 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65  e iTable must be
35150 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65   an intkey table
35160 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  . The.** integer
35170 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74   value pointed t
35180 6f 20 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73  o by pnChange is
35190 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
351a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
351b0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
351c0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
351d0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
351e0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
351f0 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
35200 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74  pnChange){.  int
35210 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
35220 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
35230 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
35240 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
35250 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
35260 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
35270 28 20 28 72 63 20 3d 20 63 68 65 63 6b 46 6f 72  ( (rc = checkFor
35280 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
35290 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21   iTable, 0, 1))!
352a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
352b0 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
352c0 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  do */.  }else if
352d0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
352e0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
352f0 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30  s(pBt, iTable, 0
35300 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  )) ){.    /* not
35310 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
35320 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
35330 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
35340 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
35350 62 6c 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65  ble, 0, pnChange
35360 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
35370 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
35380 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
35390 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
353a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20  nformation in a 
353b0 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68  table and add th
353c0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
353d0 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72  ble to.** the fr
353e0 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c  eelist.  Except,
353f0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
35400 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65   principle table
35410 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20   (the one on.** 
35420 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72  page 1) is never
35430 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
35440 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  eelist..**.** Th
35450 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
35460 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
35470 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
35480 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
35490 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
354a0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
354b0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
354c0 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61  abled and the pa
354d0 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20  ge at iTable is 
354e0 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  not the last.** 
354f0 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
35500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
35510 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
35520 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74  ot page .** in t
35530 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35540 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74   is moved into t
35550 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  he slot formerly
35560 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20   occupied by.** 
35570 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20  iTable and that 
35580 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72  last slot former
35590 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74  ly occupied by t
355a0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
355b0 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  e.** is added to
355c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
355d0 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e  stead of iTable.
355e0 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61    In this say, a
355f0 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
35600 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65   are kept at the
35610 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
35620 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
35630 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63   which.** is nec
35640 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56  essary for AUTOV
35650 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69  ACUUM to work ri
35660 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69  ght.  *piMoved i
35670 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
35680 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
35690 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65  t used to be the
356a0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
356b0 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  in the file befo
356c0 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20  re.** the move. 
356d0 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73   If no page gets
356e0 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64   moved, *piMoved
356f0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
35700 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   The last root p
35710 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20  age is recorded 
35720 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74  in meta[3] and t
35730 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d  he value of.** m
35740 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65  eta[3] is update
35750 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
35760 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
35770 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c  nt btreeDropTabl
35780 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  e(Btree *p, Pgno
35790 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
357a0 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
357b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
357c0 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
357d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
357e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
357f0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
35800 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
35810 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
35820 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a  TRANS_WRITE );..
35830 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
35840 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  al to drop a tab
35850 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
35860 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
35870 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
35880 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
35890 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
358a0 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
358b0 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
358c0 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72  o move another r
358d0 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c  oot-page to fill
358e0 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74   a gap left by t
358f0 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  he deleted.  ** 
35900 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e  root page. If an
35910 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73   open cursor was
35920 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65   using this page
35930 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
35940 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20   .  ** occur..  
35950 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43  */.  if( pBt->pC
35960 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
35970 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
35980 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
35990 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65  ->pCursor->pBtre
359a0 65 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  e->db);.    retu
359b0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
359c0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
359d0 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
359e0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
359f0 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
35a00 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69   &pPage, 0);.  i
35a10 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
35a20 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
35a30 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
35a40 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a  (p, iTable, 0);.
35a50 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
35a60 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
35a70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
35a80 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76  c;.  }..  *piMov
35a90 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ed = 0;..  if( i
35aa0 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65  Table>1 ){.#ifde
35ab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
35ac0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20  TOVACUUM.    rc 
35ad0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
35ae0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
35af0 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65  ge(pPage);.#else
35b00 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
35b10 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
35b20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67    Pgno maxRootPg
35b30 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
35b40 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
35b50 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f  ta(p, 4, &maxRoo
35b60 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  tPgno);.      if
35b70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35b80 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
35b90 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
35ba0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
35bb0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
35bc0 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78   if( iTable==max
35bd0 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20  RootPgno ){.    
35be0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61      /* If the ta
35bf0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
35c00 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77  d is the table w
35c10 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
35c20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
35c30 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
35c40 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74  he database, put
35c50 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
35c60 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  n the free list.
35c70 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
35c80 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
35c90 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
35ca0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35cb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
35cc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
35ce0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
35cf0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
35d00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
35d10 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
35d20 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ed does not have
35d30 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
35d40 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
35d50 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
35d60 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76  database. So mov
35d70 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  e the page that 
35d80 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20  does into the . 
35d90 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65         ** gap le
35da0 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
35db0 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20  d root-page..   
35dc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35dd0 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a  MemPage *pMove;.
35de0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
35df0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
35e00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35e10 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
35e20 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26  , maxRootPgno, &
35e30 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  pMove, 0);.     
35e40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35e50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
35e80 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
35e90 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52  (pBt, pMove, PTR
35ea0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c  MAP_ROOTPAGE, 0,
35eb0 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20   iTable, 0);.   
35ec0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
35ed0 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
35ee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35ef0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
35f00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
35f10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
35f20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
35f30 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f  tPage(pBt, maxRo
35f40 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20  otPgno, &pMove, 
35f50 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
35f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35f70 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
35f80 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
35f90 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
35fa0 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
35fb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
35fc0 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
35fd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
35ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
36010 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74  iMoved = maxRoot
36020 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Pgno;.      }.. 
36030 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
36040 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61  new 'max-root-pa
36050 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65  ge' value in the
36060 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
36070 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
36080 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  is the old value
36090 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20   less one, less 
360a0 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74  one more if that
360b0 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20   happens to.    
360c0 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70    ** be a root-p
360d0 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73  age number, less
360e0 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68   one again if th
360f0 61 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  at is the.      
36100 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ** PENDING_BYTE_
36110 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  PAGE..      */. 
36120 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
36130 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61  --;.      if( ma
36140 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49  xRootPgno==PENDI
36150 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
36160 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78  ) ){.        max
36170 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
36180 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61    }.      if( ma
36190 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41  xRootPgno==PTRMA
361a0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61  P_PAGENO(pBt, ma
361b0 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20  xRootPgno) ){.  
361c0 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
361d0 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
361e0 20 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f     assert( maxRo
361f0 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  otPgno!=PENDING_
36200 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
36210 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
36220 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
36230 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f  Meta(p, 4, maxRo
36240 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c  otPgno);.    }el
36250 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
36260 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
36270 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
36280 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
36290 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
362a0 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65      /* If sqlite
362b0 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20  3BtreeDropTable 
362c0 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61  was called on pa
362d0 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72  ge 1. */.    zer
362e0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46  oPage(pPage, PTF
362f0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
36300 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
36310 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
36320 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
36330 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
36340 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
36350 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
36360 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a   int *piMoved){.
36370 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
36380 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
36390 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44 72  ;.  rc = btreeDr
363a0 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  opTable(p, iTabl
363b0 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73  e, piMoved);.  s
363c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
363d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
363e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
363f0 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d   the meta-inform
36400 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64  ation out of a d
36410 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d  atabase file.  M
36420 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65  eta[0].** is the
36430 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
36440 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
36450 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
36460 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72    Meta[1].** thr
36470 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72  ough meta[15] ar
36480 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  e available for 
36490 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61  use by higher la
364a0 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  yers.  Meta[0].*
364b0 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  * is read-only, 
364c0 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72  the others are r
364d0 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a  ead/write..** .*
364e0 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79  * The schema lay
364f0 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20  er numbers meta 
36500 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74  values different
36510 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65  ly.  At the sche
36520 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64  ma.** layer (and
36530 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61   the SetCookie a
36540 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70  nd ReadCookie op
36550 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65  codes) the numbe
36560 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67  r of.** free pag
36570 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c  es is not visibl
36580 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d  e.  So Cookie[0]
36590 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
365a0 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20  Meta[1]..*/.int 
365b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
365c0 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
365d0 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74  t idx, u32 *pMet
365e0 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  a){.  DbPage *pD
365f0 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  bPage = 0;.  int
36600 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
36610 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53  char *pP1;.  BtS
36620 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
36630 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
36640 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  treeEnter(p);.. 
36650 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65   /* Reading a me
36660 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65  ta-data value re
36670 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
36680 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e  ck on page 1 (an
36690 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65  d hence.  ** the
366a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
366b0 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68  able. We grab th
366c0 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65  is lock regardle
366d0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
366e0 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51  .  ** not the SQ
366f0 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
36700 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
36710 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74   (the table root
36720 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20  ed at page.  ** 
36730 31 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20  1 is treated as 
36740 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62  a special case b
36750 79 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  y querySharedCac
36760 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 0a 20 20  heTableLock().  
36770 2a 2a 20 61 6e 64 20 73 65 74 53 68 61 72 65 64  ** and setShared
36780 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
36790 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71  )..  */.  rc = q
367a0 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
367b0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52  ableLock(p, 1, R
367c0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
367d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
367e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
367f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
36800 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
36810 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
36820 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
36830 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
36840 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62   ){.    /* The b
36850 2d 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  -tree is already
36860 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
36870 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 6f  ence to page 1 o
36880 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
36890 20 20 20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74     ** file. In t
368a0 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65 71  his case the req
368b0 75 69 72 65 64 20 6d 65 74 61 2d 64 61 74 61 20  uired meta-data 
368c0 76 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65 61  value can be rea
368d0 64 20 64 69 72 65 63 74 6c 79 0a 20 20 20 20 2a  d directly.    *
368e0 2a 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  * from the page 
368f0 64 61 74 61 20 6f 66 20 74 68 69 73 20 72 65 66  data of this ref
36900 65 72 65 6e 63 65 2e 20 54 68 69 73 20 69 73 20  erence. This is 
36910 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20  slightly faster 
36920 74 68 61 6e 0a 20 20 20 20 2a 2a 20 72 65 71 75  than.    ** requ
36930 65 73 74 69 6e 67 20 61 20 6e 65 77 20 72 65 66  esting a new ref
36940 65 72 65 6e 63 65 20 66 72 6f 6d 20 74 68 65 20  erence from the 
36950 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20 20  pager layer..   
36960 20 2a 2f 0a 20 20 20 20 70 50 31 20 3d 20 28 75   */.    pP1 = (u
36970 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
36980 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
36990 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
369a0 2f 2a 20 54 68 65 20 62 2d 74 72 65 65 20 64 6f  /* The b-tree do
369b0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  es not have a re
369c0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
369d0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
369e0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 4f  e file..    ** O
369f0 62 74 61 69 6e 20 6f 6e 65 20 66 72 6f 6d 20 74  btain one from t
36a00 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a  he pager layer..
36a10 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
36a20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
36a30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20  pBt->pPager, 1, 
36a40 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  &pDbPage);.    i
36a50 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73  f( rc ){.      s
36a60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
36a70 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
36a80 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
36a90 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  pP1 = (unsigned 
36aa0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
36ab0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
36ac0 67 65 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d 65 74  ge);.  }.  *pMet
36ad0 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  a = get4byte(&pP
36ae0 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a  1[36 + idx*4]);.
36af0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 2d 74  .  /* If the b-t
36b00 72 65 65 20 69 73 20 6e 6f 74 20 68 6f 6c 64 69  ree is not holdi
36b10 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
36b20 6f 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6f  o page 1, then o
36b30 6e 65 20 77 61 73 20 0a 20 20 2a 2a 20 72 65 71  ne was .  ** req
36b40 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
36b50 70 61 67 65 72 20 6c 61 79 65 72 20 69 6e 20 74  pager layer in t
36b60 68 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20  he above block. 
36b70 52 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a  Release it now..
36b80 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 74 2d    */.  if( !pBt-
36b90 3e 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 73  >pPage1 ){.    s
36ba0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36bb0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  (pDbPage);.  }..
36bc0 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75    /* If autovacu
36bd0 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64  umed is disabled
36be0 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62   in this build b
36bf0 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  ut we are trying
36c00 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73   to .  ** access
36c10 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64   an autovacuumed
36c20 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
36c30 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73  make the databas
36c40 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a  e readonly. .  *
36c50 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
36c60 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
36c70 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20    if( idx==4 && 
36c80 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e  *pMeta>0 ) pBt->
36c90 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65  readOnly = 1;.#e
36ca0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
36cb0 65 72 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ere is currently
36cc0 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
36cd0 74 69 6f 6e 2c 20 67 72 61 62 20 61 20 72 65 61  tion, grab a rea
36ce0 64 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  d-lock .  ** on 
36cf0 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
36d00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
36d10 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  s is done to mak
36d20 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
36d30 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
36d40 74 69 6f 6e 20 63 61 6e 20 6d 6f 64 69 66 79 20  tion can modify 
36d50 74 68 65 20 6d 65 74 61 20 76 61 6c 75 65 20 6a  the meta value j
36d60 75 73 74 20 72 65 61 64 20 66 72 6f 6d 0a 20 20  ust read from.  
36d70 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
36d80 75 6e 74 69 6c 20 74 68 65 20 74 72 61 6e 73 61  until the transa
36d90 63 74 69 6f 6e 20 69 73 20 63 6f 6e 63 6c 75 64  ction is conclud
36da0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
36db0 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 7b 0a 20  ->inTrans>0 ){. 
36dc0 20 20 20 72 63 20 3d 20 73 65 74 53 68 61 72 65     rc = setShare
36dd0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
36de0 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
36df0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
36e00 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
36e10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36e20 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69  .** Write meta-i
36e30 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20  nformation back 
36e40 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
36e50 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a  e.  Meta[0] is.*
36e60 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  * read-only and 
36e70 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74  may not be writt
36e80 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
36e90 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
36ea0 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
36eb0 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b  idx, u32 iMeta){
36ec0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
36ed0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
36ee0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
36ef0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
36f00 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69  ert( idx>=1 && i
36f10 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69  dx<=15 );.  sqli
36f20 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
36f30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
36f40 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
36f50 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
36f60 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
36f70 29 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  );.  pP1 = pBt->
36f80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
36f90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36fa0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
36fb0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
36fc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36fd0 4f 4b 20 29 7b 0a 20 20 20 20 70 75 74 34 62 79  OK ){.    put4by
36fe0 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
36ff0 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66  *4], iMeta);.#if
37000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37010 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
37020 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20  if( idx==7 ){.  
37030 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
37040 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69  >autoVacuum || i
37050 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Meta==0 );.     
37060 20 61 73 73 65 72 74 28 20 69 4d 65 74 61 3d 3d   assert( iMeta==
37070 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b  0 || iMeta==1 );
37080 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
37090 56 61 63 75 75 6d 20 3d 20 28 75 38 29 69 4d 65  Vacuum = (u8)iMe
370a0 74 61 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ta;.    }.#endif
370b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
370c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
370d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
370e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c  ** Return the fl
370f0 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20 62  ag byte at the b
37100 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
37110 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63 75  page that the cu
37120 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65  rsor.** is curre
37130 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
37140 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37150 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75 72  BtreeFlags(BtCur
37160 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
37170 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75   TODO: What abou
37180 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  t CURSOR_REQUIRE
37190 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62  SEEK state? Prob
371a0 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c  ably need to cal
371b0 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 43 75  l.  ** restoreCu
371c0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68  rsorPosition() h
371d0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50  ere..  */.  MemP
371e0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 65  age *pPage;.  re
371f0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
37200 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61  ion(pCur);.  pPa
37210 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
37220 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
37230 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
37240 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
37250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
37260 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
37270 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d  rt( pPage->pBt==
37280 70 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72  pCur->pBt );.  r
37290 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 44 61  eturn pPage->aDa
372a0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
372b0 73 65 74 5d 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  set];.}..#ifndef
372c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
372d0 45 45 43 4f 55 4e 54 0a 2f 2a 0a 2a 2a 20 54 68  EECOUNT./*.** Th
372e0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
372f0 2c 20 70 43 75 72 2c 20 69 73 20 61 20 63 75 72  , pCur, is a cur
37300 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 73 6f  sor opened on so
37310 6d 65 20 62 2d 74 72 65 65 2e 20 43 6f 75 6e 74  me b-tree. Count
37320 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
37330 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
37340 20 62 2d 74 72 65 65 20 61 6e 64 20 77 72 69 74   b-tree and writ
37350 65 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20  e the result to 
37360 2a 70 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  *pnEntry..**.** 
37370 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
37380 75 72 6e 65 64 20 69 66 20 74 68 65 20 6f 70 65  urned if the ope
37390 72 61 74 69 6f 6e 20 69 73 20 73 75 63 63 65 73  ration is succes
373a0 73 66 75 6c 6c 79 20 65 78 65 63 75 74 65 64 2e  sfully executed.
373b0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
373c0 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
373d0 6e 63 6f 75 6e 74 65 72 65 64 20 28 69 2e 65 2e  ncountered (i.e.
373e0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 72 20   an IO error or 
373f0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
37400 75 70 74 69 6f 6e 29 20 61 6e 20 53 51 4c 69 74  uption) an SQLit
37410 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
37420 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
37430 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 75   sqlite3BtreeCou
37440 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
37450 72 2c 20 69 36 34 20 2a 70 6e 45 6e 74 72 79 29  r, i64 *pnEntry)
37460 7b 0a 20 20 69 36 34 20 6e 45 6e 74 72 79 20 3d  {.  i64 nEntry =
37470 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
37480 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
37490 65 20 74 6f 20 72 65 74 75 72 6e 20 69 6e 20 2a  e to return in *
374a0 70 6e 45 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  pnEntry */.  int
374b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
374c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
374e0 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   */.  rc = moveT
374f0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 0a 20 20  oRoot(pCur);..  
37500 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72  /* Unless an err
37510 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 66  or occurs, the f
37520 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
37530 6e 73 20 6f 6e 65 20 69 74 65 72 61 74 69 6f 6e  ns one iteration
37540 20 66 6f 72 20 65 61 63 68 0a 20 20 2a 2a 20 70   for each.  ** p
37550 61 67 65 20 69 6e 20 74 68 65 20 42 2d 54 72 65  age in the B-Tre
37560 65 20 73 74 72 75 63 74 75 72 65 20 28 6e 6f 74  e structure (not
37570 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66   including overf
37580 6c 6f 77 20 70 61 67 65 73 29 2e 20 0a 20 20 2a  low pages). .  *
37590 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
375a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
375b0 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
375c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
375e0 68 69 6c 64 20 6e 6f 64 65 20 69 6e 20 70 61 72  hild node in par
375f0 65 6e 74 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ent */.    MemPa
37600 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
37610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37620 20 43 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   Current page of
37630 20 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 0a   the b-tree */..
37640 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
37650 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 72  s a leaf page or
37660 20 74 68 65 20 74 72 65 65 20 69 73 20 6e 6f 74   the tree is not
37670 20 61 6e 20 69 6e 74 2d 6b 65 79 20 74 72 65 65   an int-key tree
37680 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  , then .    ** t
37690 68 69 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  his page contain
376a0 73 20 63 6f 75 6e 74 61 62 6c 65 20 65 6e 74 72  s countable entr
376b0 69 65 73 2e 20 49 6e 63 72 65 6d 65 6e 74 20 74  ies. Increment t
376c0 68 65 20 65 6e 74 72 79 20 63 6f 75 6e 74 65 72  he entry counter
376d0 0a 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e  .    ** accordin
376e0 67 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  gly..    */.    
376f0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
37700 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
37710 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
37720 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
37730 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
37740 20 20 6e 45 6e 74 72 79 20 2b 3d 20 70 50 61 67    nEntry += pPag
37750 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 7d 0a  e->nCell;.    }.
37760 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 20 69 73  .    /* pPage is
37770 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 54 68   a leaf node. Th
37780 69 73 20 6c 6f 6f 70 20 6e 61 76 69 67 61 74 65  is loop navigate
37790 73 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  s the cursor so 
377a0 74 68 61 74 20 69 74 20 0a 20 20 20 20 2a 2a 20  that it .    ** 
377b0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
377c0 72 73 74 20 69 6e 74 65 72 69 6f 72 20 63 65 6c  rst interior cel
377d0 6c 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  l that it points
377e0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6f   to the parent o
377f0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78  f.    ** the nex
37800 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
37810 65 65 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  ee that has not 
37820 79 65 74 20 62 65 65 6e 20 76 69 73 69 74 65 64  yet been visited
37830 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 43 75  . The.    ** pCu
37840 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
37850 50 61 67 65 5d 20 76 61 6c 75 65 20 69 73 20 73  Page] value is s
37860 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
37870 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 65  of the parent ce
37880 6c 6c 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ll.    ** of the
37890 20 70 61 67 65 2c 20 6f 72 20 74 6f 20 74 68 65   page, or to the
378a0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
378b0 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
378c0 74 68 65 20 6e 65 78 74 20 70 61 67 65 0a 20 20  the next page.  
378d0 20 20 2a 2a 20 74 6f 20 76 69 73 69 74 20 69 73    ** to visit is
378e0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
378f0 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 0a   of its parent..
37900 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
37910 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
37920 65 20 74 72 65 65 20 68 61 76 65 20 62 65 65 6e  e tree have been
37930 20 76 69 73 69 74 65 64 2c 20 72 65 74 75 72 6e   visited, return
37940 20 53 51 4c 49 54 45 5f 4f 4b 20 74 6f 20 74 68   SQLITE_OK to th
37950 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e  e.    ** caller.
37960 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
37970 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
37980 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
37990 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
379a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
379b0 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6f    /* All pages o
379c0 66 20 74 68 65 20 62 2d 74 72 65 65 20 68 61 76  f the b-tree hav
379d0 65 20 62 65 65 6e 20 76 69 73 69 74 65 64 2e 20  e been visited. 
379e0 52 65 74 75 72 6e 20 73 75 63 63 65 73 73 66 75  Return successfu
379f0 6c 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lly. */.        
37a00 20 20 2a 70 6e 45 6e 74 72 79 20 3d 20 6e 45 6e    *pnEntry = nEn
37a10 74 72 79 3b 0a 20 20 20 20 20 20 20 20 20 20 72  try;.          r
37a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37a40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
37a50 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
37a60 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 20  );.      }while 
37a70 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
37a80 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72  ur->iPage]>=pCur
37a90 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
37aa0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
37ab0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
37ac0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2b  dx[pCur->iPage]+
37ad0 2b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  +;.      pPage =
37ae0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
37af0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
37b00 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 73 63 65 6e  }..    /* Descen
37b10 64 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 6e  d to the child n
37b20 6f 64 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ode of the cell 
37b30 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
37b40 63 75 72 72 65 6e 74 6c 79 20 0a 20 20 20 20 2a  currently .    *
37b50 2a 20 70 6f 69 6e 74 73 20 61 74 2e 20 54 68 69  * points at. Thi
37b60 73 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  s is the right-c
37b70 68 69 6c 64 20 69 66 20 28 69 49 64 78 3d 3d 70  hild if (iIdx==p
37b80 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 2e 0a 20 20  Page->nCell)..  
37b90 20 20 2a 2f 0a 20 20 20 20 69 49 64 78 20 3d 20    */.    iIdx = 
37ba0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
37bb0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
37bc0 28 20 69 49 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  ( iIdx==pPage->n
37bd0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Cell ){.      rc
37be0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
37bf0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
37c00 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
37c10 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
37c20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
37c30 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
37c40 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
37c50 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
37c60 67 65 2c 20 69 49 64 78 29 29 29 3b 0a 20 20 20  ge, iIdx)));.   
37c70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20   }.  }..  /* An 
37c80 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
37c90 65 64 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  ed. Return an er
37ca0 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 72  ror code. */.  r
37cb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
37cc0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
37cd0 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
37ce0 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
37cf0 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
37d00 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
37d10 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
37d20 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
37d30 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
37d40 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
37d50 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
37d60 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a  pBt->pPager;.}..
37d70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37d80 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
37d90 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  ECK./*.** Append
37da0 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68   a message to th
37db0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
37dc0 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
37dd0 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65  c void checkAppe
37de0 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69  ndMsg(.  Integri
37df0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20  tyCk *pCheck,.  
37e00 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63  char *zMsg1,.  c
37e10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
37e20 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76  at,.  ....){.  v
37e30 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
37e40 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20   !pCheck->mxErr 
37e50 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65  ) return;.  pChe
37e60 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70  ck->mxErr--;.  p
37e70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Check->nErr++;. 
37e80 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
37e90 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 43  ormat);.  if( pC
37ea0 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68  heck->errMsg.nCh
37eb0 61 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ar ){.    sqlite
37ec0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
37ed0 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
37ee0 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20   "\n", 1);.  }. 
37ef0 20 69 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20   if( zMsg1 ){.  
37f00 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
37f10 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d  mAppend(&pCheck-
37f20 3e 65 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20  >errMsg, zMsg1, 
37f30 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  -1);.  }.  sqlit
37f40 65 33 56 58 50 72 69 6e 74 66 28 26 70 43 68 65  e3VXPrintf(&pChe
37f50 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a  ck->errMsg, 1, z
37f60 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
37f70 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
37f80 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e   pCheck->errMsg.
37f90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
37fa0 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c      pCheck->mall
37fb0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
37fc0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
37fd0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
37fe0 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
37ff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
38000 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
38010 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  K./*.** Add 1 to
38020 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
38030 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
38040 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
38050 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
38060 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
38070 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
38080 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
38090 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
380a0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
380b0 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
380c0 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
380d0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
380e0 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
380f0 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
38100 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
38110 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
38120 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
38130 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
38140 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
38150 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
38160 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
38170 2c 20 50 67 6e 6f 20 69 50 61 67 65 2c 20 63 68  , Pgno iPage, ch
38180 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20  ar *zContext){. 
38190 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20   if( iPage==0 ) 
381a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
381b0 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50  iPage>pCheck->nP
381c0 61 67 65 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  age ){.    check
381d0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
381e0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76  , zContext, "inv
381f0 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72  alid page number
38200 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
38210 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
38220 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e    if( pCheck->an
38230 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b  Ref[iPage]==1 ){
38240 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
38250 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
38260 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72  text, "2nd refer
38270 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22  ence to page %d"
38280 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
38290 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
382a0 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61  turn  (pCheck->a
382b0 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31  nRef[iPage]++)>1
382c0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
382d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
382e0 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  UUM./*.** Check 
382f0 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69  that the entry i
38300 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
38310 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c  p for page iChil
38320 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61  d maps to .** pa
38330 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e  ge iParent, poin
38340 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65  ter type ptrType
38350 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64  . If not, append
38360 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
38370 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a  e.** to pCheck..
38380 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
38390 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e  heckPtrmap(.  In
383a0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
383b0 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  k,   /* Integrit
383c0 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20  y check context 
383d0 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
383e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
383f0 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72  hild page number
38400 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
38410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38420 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
38430 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50   map type */.  P
38440 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20  gno iParent,    
38450 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
38460 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  d pointer map pa
38470 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
38480 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
38490 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20  text         /* 
384a0 43 6f 6e 74 65 78 74 20 64 65 73 63 72