/ Hex Artifact Content
Login

Artifact 39559c172e4f970d53fd2dbb7cf25641613eec47:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 36 38 35 20 32 30 30 39 2f 30  c,v 1.685 2009/0
0190: 37 2f 31 33 20 31 31 3a 32 32 3a 31 30 20 64 61  7/13 11:22:10 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f....#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  CACHE./*.** A li
0450: 73 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f  st of BtShared o
0460: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
0470: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72  eligible for par
0480: 74 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e  ticipation.** in
0490: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
04a0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
04b0: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72  s file scope dur
04c0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  ing normal build
04d0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65  s,.** but the te
04e0: 73 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73  st harness needs
04f0: 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f   to access it so
0500: 20 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62   we make it glob
0510: 61 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20  al for .** test 
0520: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63  builds..**.** Ac
0530: 63 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72  cess to this var
0540: 69 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74  iable is protect
0550: 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54  ed by SQLITE_MUT
0560: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
0570: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0580: 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64  TE_TEST.BtShared
0590: 20 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c   *SQLITE_WSD sql
05a0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
05b0: 69 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ist = 0;.#else.s
05c0: 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a  tatic BtShared *
05d0: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
05e0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05f0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  t = 0;.#endif.#e
0600: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0610: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0620: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0630: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0640: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0650: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0660: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0670: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0680: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0690: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
06a0: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06c0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06d0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06e0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06f0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
0700: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0710: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0720: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0730: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0740: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0750: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0760: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0770: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0780: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0790: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
07a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
07b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69  ;.}.#endif....#i
07c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
07d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
07e0: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63  /*.  ** The func
07f0: 74 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65  tions queryShare
0800: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0810: 29 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ), setSharedCach
0820: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20  eTableLock(),.  
0830: 2a 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53  ** and clearAllS
0840: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0850: 6f 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  ocks().  ** mani
0860: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0870: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0880: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0890: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
08a0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
08b0: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08c0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08d0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08e0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08f0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
0900: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
0910: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0920: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0930: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0940: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0950: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0960: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0970: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0980: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0990: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
09a0: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
09b0: 23 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61  #define querySha
09c0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
09d0: 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  k(a,b,c) SQLITE_
09e0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74  OK.  #define set
09f0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a00: 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49  Lock(a,b,c) SQLI
0a10: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
0a20: 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
0a30: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29  cheTableLocks(a)
0a40: 0a 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67  .  #define downg
0a50: 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
0a60: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0a70: 20 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61    #define hasSha
0a80: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0a90: 6b 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23  k(a,b,c,d) 1.  #
0aa0: 64 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f  define hasReadCo
0ab0: 6e 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a  nflicts(a, b) 0.
0ac0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0ad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0ae0: 45 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66  ED_CACHE..#ifdef
0af0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
0b00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
0b10: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0b20: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0b30: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0b40: 20 49 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68   It checks.** th
0b50: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  at connection p 
0b60: 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75 69 72  holds the requir
0b70: 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65 61 64  ed locks to read
0b80: 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
0b90: 20 0a 2a 2a 20 62 2d 74 72 65 65 20 77 69 74 68   .** b-tree with
0ba0: 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74   root page iRoot
0bb0: 2e 20 49 66 20 73 6f 2c 20 74 72 75 65 20 69 73  . If so, true is
0bc0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
0bd0: 77 69 73 65 2c 20 66 61 6c 73 65 2e 20 0a 2a 2a  wise, false. .**
0be0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   For example, wh
0bf0: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20  en writing to a 
0c00: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 77 69 74  table b-tree wit
0c10: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
0c20: 74 20 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20  t via .** Btree 
0c30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65  connection pBtre
0c40: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65  e:.**.**    asse
0c50: 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
0c60: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72  heTableLock(pBtr
0c70: 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52  ee, iRoot, 0, WR
0c80: 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a  ITE_LOCK) );.**.
0c90: 2a 2a 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20  ** When writing 
0ca0: 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
0cb0: 65 65 20 74 68 61 74 20 72 65 73 69 64 65 73 20  ee that resides 
0cc0: 69 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61  in a sharable da
0cd0: 74 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20  tabase, the .** 
0ce0: 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61  caller should ha
0cf0: 76 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65  ve first obtaine
0d00: 64 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79  d a lock specify
0d10: 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ing the root pag
0d20: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72  e of.** the corr
0d30: 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
0d40: 62 2d 74 72 65 65 2e 20 54 68 69 73 20 6d 61 6b  b-tree. This mak
0d50: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
0d60: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
0d70: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
0d80: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
0d90: 62 2d 74 72 65 65 20 61 73 20 61 20 73 65 70 61  b-tree as a sepa
0da0: 72 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20  rate structure. 
0db0: 54 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  To determine.** 
0dc0: 74 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65 65  the table b-tree
0dd0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0de0: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  o the index b-tr
0df0: 65 65 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ee being written
0e00: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0e10: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0e20: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0e30: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0e40: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0e50: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 62 2d 74   lock on the b-t
0e60: 72 65 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ree rooted at pa
0e70: 67 65 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61  ge iRoot, the ca
0e80: 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64  ller may.** hold
0e90: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
0ea0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
0eb0: 65 20 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e  e (root page 1).
0ec0: 20 54 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a   This is also.**
0ed0: 20 61 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a   acceptable..*/.
0ee0: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 53 68  static int hasSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ck(.  Btree *pBt
0f10: 72 65 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ree,         /* 
0f20: 48 61 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74  Handle that must
0f30: 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   hold lock */.  
0f40: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
0f50: 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
0f60: 61 67 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f  age of b-tree */
0f70: 0a 20 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20  .  int isIndex, 
0f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0f90: 65 20 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68  e if iRoot is th
0fa0: 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64  e root of an ind
0fb0: 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69  ex b-tree */.  i
0fc0: 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20  nt eLockType    
0fd0: 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
0fe0: 64 20 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41  d lock type (REA
0ff0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1000: 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63  LOCK) */.){.  Sc
1010: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
1020: 28 53 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65  (Schema *)pBtree
1030: 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a  ->pBt->pSchema;.
1040: 20 20 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b    Pgno iTab = 0;
1050: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
1060: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1070: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 20  b-tree database 
1080: 69 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65  is not shareable
1090: 2c 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65  , or if the clie
10a0: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20  nt is reading.  
10b0: 2a 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72  ** and has the r
10c0: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
10d0: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e  flag set, then n
10e0: 6f 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72  o lock is requir
10f0: 65 64 2e 20 0a 20 20 2a 2a 20 49 6e 20 74 68 65  ed. .  ** In the
1100: 73 65 20 63 61 73 65 73 20 72 65 74 75 72 6e 20  se cases return 
1110: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1120: 2e 20 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74  .  If the client
1130: 20 69 73 20 72 65 61 64 69 6e 67 20 0a 20 20 2a   is reading .  *
1140: 2a 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20  * or writing an 
1150: 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 62 75  index b-tree, bu
1160: 74 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  t the schema is 
1170: 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65 6e  not loaded, then
1180: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   return.  ** tru
1190: 65 20 61 6c 73 6f 2e 20 49 6e 20 74 68 69 73 20  e also. In this 
11a0: 63 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 69 73  case the lock is
11b0: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 69   required, but i
11c0: 74 20 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75  t is too difficu
11d0: 6c 74 0a 20 20 2a 2a 20 74 6f 20 63 68 65 63 6b  lt.  ** to check
11e0: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 61   if the client a
11f0: 63 74 75 61 6c 6c 79 20 68 6f 6c 64 73 20 69 74  ctually holds it
1200: 2e 20 54 68 69 73 20 64 6f 65 73 6e 27 74 20 68  . This doesn't h
1210: 61 70 70 65 6e 20 76 65 72 79 0a 20 20 2a 2a 20  appen very.  ** 
1220: 6f 66 74 65 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  often.  */.  if(
1230: 20 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61 62   (pBtree->sharab
1240: 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65 4c  le==0).   || (eL
1250: 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c 4f  ockType==READ_LO
1260: 43 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e 64  CK && (pBtree->d
1270: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1280: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
1290: 64 29 29 0a 20 20 20 7c 7c 20 28 69 73 49 6e 64  d)).   || (isInd
12a0: 65 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20  ex && (!pSchema 
12b0: 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 66 6c 61  || (pSchema->fla
12c0: 67 73 26 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  gs&DB_SchemaLoad
12d0: 65 64 29 3d 3d 30 20 29 29 0a 20 20 29 7b 0a 20  ed)==0 )).  ){. 
12e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
12f0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1300: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
1310: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
1320: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
1330: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
1340: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
1350: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1360: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1370: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1380: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1390: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
13a0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
13b0: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
13c0: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
13d0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
13e0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
13f0: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
1400: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
1410: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
1420: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
1430: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
1440: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
1450: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1460: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1470: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1480: 74 6e 75 6d 3d 3d 69 52 6f 6f 74 20 29 7b 0a 09  tnum==iRoot ){..
1490: 69 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  iTab = pIdx->pTa
14a0: 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  ble->tnum;.     
14b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
14c0: 7b 0a 20 20 20 20 69 54 61 62 20 3d 20 69 52 6f  {.    iTab = iRo
14d0: 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ot;.  }..  /* Se
14e0: 61 72 63 68 20 66 6f 72 20 74 68 65 20 72 65 71  arch for the req
14f0: 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68  uired lock. Eith
1500: 65 72 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  er a write-lock 
1510: 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  on root-page iTa
1520: 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65  b, a .  ** write
1530: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
1540: 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72 20 28 69  ema table, or (i
1550: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
1560: 72 65 61 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20  reading) a.  ** 
1570: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61  read-lock on iTa
1580: 62 20 77 69 6c 6c 20 73 75 66 66 69 63 65 2e 20  b will suffice. 
1590: 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e 79 20  Return 1 if any 
15a0: 6f 66 20 74 68 65 73 65 20 61 72 65 20 66 6f 75  of these are fou
15b0: 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c  nd.  */.  for(pL
15c0: 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  ock=pBtree->pBt-
15d0: 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70  >pLock; pLock; p
15e0: 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78  Lock=pLock->pNex
15f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  t){.    if( pLoc
1600: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 72 65  k->pBtree==pBtre
1610: 65 20 0a 20 20 20 20 20 26 26 20 28 70 4c 6f 63  e .     && (pLoc
1620: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20  k->iTable==iTab 
1630: 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  || (pLock->eLock
1640: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20  ==WRITE_LOCK && 
1650: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31  pLock->iTable==1
1660: 29 29 0a 20 20 20 20 20 26 26 20 70 4c 6f 63 6b  )).     && pLock
1670: 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79  ->eLock>=eLockTy
1680: 70 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  pe .    ){.     
1690: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
16a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65  .  }..  /* Faile
16b0: 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72 65  d to find the re
16c0: 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  quired lock. */.
16d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
16e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16f0: 6f 6e 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  on is also used 
1700: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
1710: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  t() statements o
1720: 6e 6c 79 2e 20 49 74 20 0a 2a 2a 20 72 65 74 75  nly. It .** retu
1730: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 72  rns true if ther
1740: 65 20 65 78 69 73 74 20 6f 6e 65 20 6f 72 20 6d  e exist one or m
1750: 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  ore cursors open
1760: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   on the table .*
1770: 2a 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67 65  * with root page
1780: 20 69 52 6f 6f 74 20 74 68 61 74 20 64 6f 20 6e   iRoot that do n
1790: 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 65 69 74  ot belong to eit
17a0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  her connection p
17b0: 42 74 72 65 65 20 0a 2a 2a 20 6f 72 20 73 6f 6d  Btree .** or som
17c0: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
17d0: 6f 6e 20 74 68 61 74 20 68 61 73 20 74 68 65 20  on that has the 
17e0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
17f0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
1800: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1810: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1820: 70 61 67 65 20 69 52 6f 6f 74 3a 0a 2a 2a 0a 2a  page iRoot:.**.*
1830: 2a 20 20 20 20 61 73 73 65 72 74 28 20 21 68 61  *    assert( !ha
1840: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
1850: 42 74 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b  Btree, iRoot) );
1860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
1870: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
1880: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50  Btree *pBtree, P
1890: 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74  gno iRoot){.  Bt
18a0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72  Cursor *p;.  for
18b0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
18c0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
18d0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
18e0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
18f0: 6f 6f 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e  oot .     && p->
1900: 70 42 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20  pBtree!=pBtree. 
1910: 20 20 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42      && 0==(p->pB
1920: 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  tree->db->flags 
1930: 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
1940: 6f 6d 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b  ommitted).    ){
1950: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1970: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1980: 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c     /* #ifdef SQL
1990: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
19a0: 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65  .** Query to see
19b0: 20 69 66 20 62 74 72 65 65 20 68 61 6e 64 6c 65   if btree handle
19c0: 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20   p may obtain a 
19d0: 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f  lock of type eLo
19e0: 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43  ck .** (READ_LOC
19f0: 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29  K or WRITE_LOCK)
1a00: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
1a10: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
1a20: 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  b. Return.** SQL
1a30: 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f  ITE_OK if the lo
1a40: 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e  ck may be obtain
1a50: 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a  ed (by calling.*
1a60: 2a 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  * setSharedCache
1a70: 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72  TableLock()), or
1a80: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
1a90: 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
1aa0: 20 69 6e 74 20 71 75 65 72 79 53 68 61 72 65 64   int queryShared
1ab0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
1ac0: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
1ad0: 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20  ab, u8 eLock){. 
1ae0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1af0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
1b00: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
1b10: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1b20: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1b30: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
1b40: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
1b50: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1b60: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
1b70: 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
1b80: 65 72 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c  ert( !(p->db->fl
1b90: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
1ba0: 6e 63 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f  ncommitted)||eLo
1bb0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c  ck==WRITE_LOCK||
1bc0: 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20  iTab==1 );.  .  
1bd0: 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e 67  /* If requesting
1be0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74   a write-lock, t
1bf0: 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75  hen the Btree mu
1c00: 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  st have an open 
1c10: 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73  write.  ** trans
1c20: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66  action on this f
1c30: 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75  ile. And, obviou
1c40: 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f  sly, for this to
1c50: 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20   be so there .  
1c60: 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  ** must be an op
1c70: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
1c80: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65  tion on the file
1c90: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
1ca0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
1cb0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d  EAD_LOCK || (p==
1cc0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20  pBt->pWriter && 
1cd0: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1ce0: 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73  S_WRITE) );.  as
1cf0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1d00: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69  D_LOCK || pBt->i
1d10: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1d20: 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a  ANS_WRITE );.  .
1d30: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1d40: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
1d50: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
1d60: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
1d70: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
1d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1da0: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
1db0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
1dc0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
1dd0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
1de0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
1df0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
1e00: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
1e10: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
1e20: 26 26 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73  && pBt->isExclus
1e30: 69 76 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ive ){.    sqlit
1e40: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
1e50: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
1e60: 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20  pWriter->db);.  
1e70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e80: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1e90: 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70  HE;.  }..  for(p
1ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
1eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
1ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
1ed0: 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   /* The conditio
1ee0: 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21  n (pIter->eLock!
1ef0: 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66  =eLock) in the f
1f00: 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29  ollowing if(...)
1f10: 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
1f20: 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69  nt is a simplifi
1f30: 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a  cation of:.    *
1f40: 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63  *.    **   (eLoc
1f50: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
1f60: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
1f70: 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a  RITE_LOCK).    *
1f80: 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77  *.    ** since w
1f90: 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65  e know that if e
1fa0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
1fb0: 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20  , then no other 
1fc0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a  connection.    *
1fd0: 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49  * may hold a WRI
1fe0: 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74  TE_LOCK on any t
1ff0: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c  able in this fil
2000: 65 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 63  e (since there c
2010: 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62  an.    ** only b
2020: 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65  e a single write
2030: 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  r)..    */.    a
2040: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c  ssert( pIter->eL
2050: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2060: 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  | pIter->eLock==
2070: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
2080: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2090: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  =READ_LOCK || pI
20a0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c  ter->pBtree==p |
20b0: 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  | pIter->eLock==
20c0: 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  READ_LOCK);.    
20d0: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
20e0: 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69  e!=p && pIter->i
20f0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70  Table==iTab && p
2100: 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f  Iter->eLock!=eLo
2110: 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ck ){.      sqli
2120: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
2130: 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65  cked(p->db, pIte
2140: 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a  r->pBtree->db);.
2150: 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d        if( eLock=
2160: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20  =WRITE_LOCK ){. 
2170: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2180: 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  ==pBt->pWriter )
2190: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
21a0: 73 50 65 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20  sPending = 1;.  
21b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
21c0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
21d0: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
21e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2250: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
2260: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
2270: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
2280: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
2290: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
22a0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
22b0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
22c0: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
22d0: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
22e0: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
22f0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2300: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2310: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2320: 20 73 70 65 63 69 66 69 65 64 20 62 2d 74 72 65   specified b-tre
2330: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
2340: 64 6c 65 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  dle is connected
2350: 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a   to a sharable.*
2360: 2a 20 20 20 20 20 20 20 62 2d 74 72 65 65 20 64  *       b-tree d
2370: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
2380: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
2390: 68 61 72 61 62 6c 65 29 20 66 6c 61 67 20 73 65  harable) flag se
23a0: 74 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  t, and.**.**   (
23b0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 62 2d 74 72  b) No other b-tr
23c0: 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  ee connection ha
23d0: 6e 64 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63  ndle holds a loc
23e0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
23f0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
2400: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2410: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2420: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2430: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2440: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2450: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2460: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2470: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2480: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2490: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
24a0: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
24b0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
24c0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
24d0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
24e0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
24f0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
2500: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2510: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2520: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2530: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2540: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2550: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2560: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2570: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2580: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2590: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
25a0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
25b0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
25c0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
25d0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
25e0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
25f0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
2600: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2610: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2620: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2630: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2640: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2650: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2660: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2670: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2680: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2690: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
26a0: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
26b0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
26c0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
26d0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
26e0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
26f0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2700: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2710: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2720: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2730: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2740: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2750: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2760: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2770: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2780: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2790: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
27a0: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
27b0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
27c0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
27d0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27e0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
27f0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2800: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2820: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2830: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2840: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2850: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2860: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2870: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2880: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2890: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
28a0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
28b0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
28c0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
28d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
28e0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
28f0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2910: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2920: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2930: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2940: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2950: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2960: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2970: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2980: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2990: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
29a0: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
29b0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
29c0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
29d0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
29e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
29f0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2a00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2a10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2a20: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2a30: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2a40: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2a50: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2a60: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2a70: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2a80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2a90: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2aa0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2ab0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2ac0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2ad0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2ae0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2af0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2b00: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2b10: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2b20: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2b30: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2b40: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2b50: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2b60: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2b70: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2b80: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2b90: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2ba0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2bb0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2bc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bd0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2be0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2bf0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2c00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c10: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2c20: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2c30: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2c40: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2c50: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2c60: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2c70: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2c80: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2c90: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
2ca0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2cb0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2cc0: 61 74 20 68 61 6e 64 6c 65 20 70 20 68 61 73 20  at handle p has 
2cd0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
2ce0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
2cf0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
2d00: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
2d10: 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69  BtShared.isPendi
2d20: 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  ng variable.** m
2d30: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
2d40: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
2d50: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
2d60: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
2d70: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
2d80: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2d90: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2da0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
2db0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
2dc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2dd0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2de0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2df0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
2e00: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
2e10: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
2e20: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
2e30: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
2e40: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
2e50: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
2e60: 65 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c  ert( pBt->isExcl
2e70: 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d  usive==0 || pBt-
2e80: 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d  >pWriter==pLock-
2e90: 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61  >pBtree );.    a
2ea0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42  ssert( pLock->pB
2eb0: 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70  tree->inTrans>=p
2ec0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20  Lock->eLock );. 
2ed0: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
2ee0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
2ef0: 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b   *ppIter = pLock
2f00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61  ->pNext;.      a
2f10: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54  ssert( pLock->iT
2f20: 61 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b  able!=1 || pLock
2f30: 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20  ==&p->lock );.  
2f40: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69      if( pLock->i
2f50: 54 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20  Table!=1 ){.    
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2f70: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d  (pLock);.      }
2f80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f90: 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63    ppIter = &pLoc
2fa0: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  k->pNext;.    }.
2fb0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
2fc0: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30  Bt->isPending==0
2fd0: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2fe0: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   );.  if( pBt->p
2ff0: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3000: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3010: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78  0;.    pBt->isEx
3020: 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20  clusive = 0;.   
3030: 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
3040: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
3050: 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
3060: 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20  on==2 ){.    /* 
3070: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3080: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e   called when con
3090: 6e 65 63 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e  nection p is con
30a0: 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20  cluding its .   
30b0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e   ** transaction.
30c0: 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e   If there curren
30d0: 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69  tly exists a wri
30e0: 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f  ter, and p is no
30f0: 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72  t.    ** that wr
3100: 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e  iter, then the n
3110: 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68  umber of locks h
3120: 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
3130: 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ns other.    ** 
3140: 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20  than the writer 
3150: 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f  must be about to
3160: 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49   drop to zero. I
3170: 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20  n this case.    
3180: 2a 2a 20 73 65 74 20 74 68 65 20 69 73 50 65 6e  ** set the isPen
3190: 64 69 6e 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a  ding flag to 0..
31a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
31b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75   there is not cu
31c0: 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72  rrently a writer
31d0: 2c 20 74 68 65 6e 20 42 74 53 68 61 72 65 64 2e  , then BtShared.
31e0: 69 73 50 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20  isPending must. 
31f0: 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c     ** be zero al
3200: 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20 6e  ready. So this n
3210: 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72 6d  ext line is harm
3220: 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61 73  less in that cas
3230: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42  e..    */.    pB
3240: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30  t->isPending = 0
3250: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3260: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
3270: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
3280: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3290: 6e 65 63 74 69 6f 6e 20 70 20 74 6f 20 72 65 61  nection p to rea
32a0: 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  d-locks..*/.stat
32b0: 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64  ic void downgrad
32c0: 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
32d0: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
32e0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
32f0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
3300: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3310: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f  r==p ){.    BtLo
3320: 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  ck *pLock;.    p
3330: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3340: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
3350: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
3360: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
3370: 30 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b  0;.    for(pLock
3380: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  =pBt->pLock; pLo
3390: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
33a0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
33b0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c  ssert( pLock->eL
33c0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
33d0: 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  | pLock->pBtree=
33e0: 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63  =p );.      pLoc
33f0: 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  k->eLock = READ_
3400: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
3410: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3420: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3430: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
3440: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
3450: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
3460: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
3470: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
3480: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3490: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
34a0: 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
34b0: 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64  tShared.*/.#ifnd
34c0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
34d0: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
34e0: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
34f0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3500: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3510: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3520: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
3530: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
3540: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e  NCRBLOB./*.** In
3550: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3560: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
3570: 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72  cache for cursor
3580: 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a   pCur, if any..*
3590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
35a0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
35b0: 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a  Cache(BtCursor *
35c0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
35d0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
35e0: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
35f0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
3600: 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
3610: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
3620: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  0;.}../*.** Inva
3630: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
3640: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
3650: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
3660: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
3670: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3680: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3690: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36a0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
36b0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
36c0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
36d0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
36e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
36f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3700: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3710: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3720: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3730: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3740: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3750: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3760: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
3770: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
3780: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
3790: 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 62 2d 74  f a table.** b-t
37a0: 72 65 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  ree to invalidat
37b0: 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
37c0: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
37d0: 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  open on the.** r
37e0: 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ow or one of the
37f0: 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69   rows being modi
3800: 66 69 65 64 2e 20 41 72 67 75 6d 65 6e 74 20 70  fied. Argument p
3810: 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 0a  gnoRoot is the .
3820: 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
3830: 74 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65 65  the table b-tree
3840: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  . .**.** If argu
3850: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3860: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3870: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3880: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3890: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
38a0: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
38b0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
38c0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
38d0: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
38e0: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
38f0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3900: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
3910: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
3920: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
3930: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3940: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
3950: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
3960: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
3970: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
3980: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3990: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
39a0: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
39b0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
39c0: 70 65 6e 20 6f 6e 20 74 68 69 73 20 73 70 65 63  pen on this spec
39d0: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
39e0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39f0: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
3a00: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
3a10: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
3a20: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
3a30: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
3a40: 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20   Pgno pgnoRoot, 
3a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b           /* Look
3a60: 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
3a70: 73 20 6f 6e 20 74 68 69 73 20 62 74 72 65 65 20  s on this btree 
3a80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3aa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3ab0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3ac0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3ad0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3ae0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3af0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
3b00: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
3b10: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
3b20: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
3b30: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
3b40: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
3b50: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
3b60: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
3b70: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
3b80: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
3b90: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
3ba0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
3bb0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
3bc0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
3bd0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
3be0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
3bf0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
3c00: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
3c10: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3c20: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3c30: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
3c40: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
3c50: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3c60: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3c70: 75 72 73 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a  ursors(w,x,y,z).
3c80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
3c90: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
3ca0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
3cb0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
3cc0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
3cd0: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
3ce0: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
3cf0: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
3d00: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
3d10: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
3d20: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
3d30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
3d40: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
3d50: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
3d60: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
3d70: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
3d80: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
3d90: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
3da0: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
3db0: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
3dc0: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
3dd0: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
3de0: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
3df0: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
3e00: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
3e10: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
3e20: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
3e30: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
3e40: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
3e50: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
3e60: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
3e70: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
3e80: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
3e90: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
3ea0: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
3eb0: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
3ec0: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
3ed0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
3ee0: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
3ef0: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
3f00: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
3f10: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
3f20: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
3f30: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
3f40: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
3f50: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
3f60: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
3f70: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
3f80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
3f90: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
3fa0: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
3fb0: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
3fc0: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
3fd0: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
3fe0: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
3ff0: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
4000: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
4010: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
4020: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
4030: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
4040: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
4050: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
4060: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
4070: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4080: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
4090: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
40a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
40b0: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
40c0: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
40d0: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
40e0: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
40f0: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
4100: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
4110: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
4120: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
4130: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4140: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4150: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
4160: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
4170: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
4180: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
4190: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
41a0: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
41b0: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
41c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
41d0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
41e0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
41f0: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
4200: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
4210: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4220: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
4230: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
4240: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
4250: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4260: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
4270: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
4280: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
4290: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
42a0: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
42b0: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
42c0: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
42d0: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
42e0: 73 20 6f 6d 6d 69 74 74 65 64 20 69 66 20 74 68  s ommitted if th
42f0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4300: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4310: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4320: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4330: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4340: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4350: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
4360: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
4370: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
4380: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
4390: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
43a0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
43b0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
43c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
43d0: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
43e0: 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ent ){.    int n
43f0: 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Page;.    rc = s
4400: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
4410: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
4420: 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
4430: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4440: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
4450: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
4460: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
4470: 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a 20 20  ((u32)nPage);.  
4480: 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48      if( !pBt->pH
4490: 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  asContent ){.   
44a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
44b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
44d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
44e0: 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69   pgno<=sqlite3Bi
44f0: 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48  tvecSize(pBt->pH
4500: 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20  asContent) ){.  
4510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
4520: 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61  tvecSet(pBt->pHa
4530: 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b  sContent, pgno);
4540: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4550: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79  ;.}../*.** Query
4560: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
4570: 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72  asContent vector
4580: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
4590: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
45a0: 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  when a free-list
45b0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
45c0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  moved from the.*
45d0: 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20  * free-list for 
45e0: 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e  reuse. It return
45f0: 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  s false if it is
4600: 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65 76   safe to retriev
4610: 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72  e the.** page fr
4620: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
4630: 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
4640: 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
4650: 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69 73  t. True otherwis
4660: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4670: 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74   btreeGetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74   Bitvec *p = pBt
46b0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20  ->pHasContent;. 
46c0: 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70   return (p && (p
46d0: 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65  gno>sqlite3Bitve
46e0: 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69  cSize(p) || sqli
46f0: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2c  te3BitvecTest(p,
4700: 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a   pgno)));.}../*.
4710: 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f  ** Clear (destro
4720: 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  y) the BtShared.
4730: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4740: 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ec. This should 
4750: 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74  be.** invoked at
4760: 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
4770: 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74 72  of each write-tr
4780: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
4790: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43  atic void btreeC
47a0: 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42  learHasContent(B
47b0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
47c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
47d0: 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43  stroy(pBt->pHasC
47e0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e  ontent);.  pBt->
47f0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b  pHasContent = 0;
4800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
4810: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
4820: 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  r position in th
4830: 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  e variables BtCu
4840: 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e  rsor.nKey .** an
4850: 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e  d BtCursor.pKey.
4860: 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74   The cursor's st
4870: 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
4880: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
4890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48a0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
48b0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
48c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
48d0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
48e0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
48f0: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
4900: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
4910: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
4920: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
4930: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
4940: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
4950: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
4960: 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Key);..  /* If t
4970: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4980: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4990: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
49a0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
49b0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
49c0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
49d0: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
49e0: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
49f0: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
4a00: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
4a10: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
4a20: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
4a30: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
4a40: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
4a50: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
4a60: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
4a70: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
4a80: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
4a90: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
4aa0: 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43  LITE_OK && 0==pC
4ab0: 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
4ac0: 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69 64  ntKey){.    void
4ad0: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
4ae0: 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43 75  Malloc( (int)pCu
4af0: 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69  r->nKey );.    i
4b00: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
4b10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4b20: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
4b30: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  int)pCur->nKey, 
4b40: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
4b50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4b60: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
4b70: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
4b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4ba0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
4bb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
4bc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4bd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
4be0: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50  sert( !pCur->apP
4bf0: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
4c00: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
4c10: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
4c20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
4c30: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
4c40: 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
4c50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
4c60: 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
4c70: 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
4c80: 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
4c90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
4ca0: 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
4cb0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
4cc0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
4cd0: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
4ce0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4cf0: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
4d00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4d10: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f  *.** Save the po
4d20: 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63  sitions of all c
4d30: 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45  ursors except pE
4d40: 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68  xcept open on th
4d50: 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68  e table .** with
4d60: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
4d70: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
4d80: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
4d90: 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20  efore cursor.** 
4da0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
4db0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61  to modify the ta
4dc0: 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65  ble (BtreeDelete
4dd0: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
4de0: 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t())..*/.static 
4df0: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
4e00: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
4e10: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
4e20: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
4e30: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
4e40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4e50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
4e60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
4e70: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
4e80: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
4e90: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
4ea0: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
4eb0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
4ec0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
4ed0: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
4ee0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
4ef0: 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20  iRoot) && .     
4f00: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55     p->eState==CU
4f10: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
4f20: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
4f30: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
4f40: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  p);.      if( SQ
4f50: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
4f60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
4f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4f80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
4f90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4fa0: 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65   Clear the curre
4fb0: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
4fc0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
4fd0: 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
4fe0: 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
4ff0: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
5000: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5010: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
5020: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5030: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
5040: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
5050: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5060: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
5070: 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
5080: 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c   of BtreeMoveto,
5090: 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65   pKey is a packe
50a0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a  d index record.*
50b0: 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e  * such as is gen
50c0: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  erated by the OP
50d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
50e0: 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a  de.  Unpack the.
50f0: 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68  ** record and th
5100: 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76  en call BtreeMov
5110: 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
5120: 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f   do the work..*/
5130: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
5140: 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
5150: 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f  sor *pCur,     /
5160: 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
5170: 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   the btree to be
5180: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
5190: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
51a0: 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79     /* Packed key
51b0: 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73   if the btree is
51c0: 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   an index */.  i
51d0: 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
51e0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65     /* Integer ke
51f0: 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53  y for tables.  S
5200: 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20  ize of pKey for 
5210: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
5220: 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20   bias,          
5230: 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20   /* Bias search 
5240: 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
5250: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
5260: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
5270: 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
5280: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
5290: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
52a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
52b0: 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70  us code */.  Unp
52c0: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
52d0: 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63  xKey;   /* Unpac
52e0: 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
52f0: 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 31  .  char aSpace[1
5300: 35 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  50];          /*
5310: 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20   Temp space for 
5320: 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f  pIdxKey - to avo
5330: 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  id a malloc */..
5340: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5350: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
5360: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
5370: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
5380: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
5390: 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b  dUnpack(pCur->pK
53a0: 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65  eyInfo, (int)nKe
53b0: 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, pKey,.       
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
53e0: 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53  Space, sizeof(aS
53f0: 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20  pace));.    if( 
5400: 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74  pIdxKey==0 ) ret
5410: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5420: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5430: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
5440: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
5470: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
5480: 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29  s);.  if( pKey )
5490: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
54a0: 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
54b0: 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a  ecord(pIdxKey);.
54c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
54d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
54e0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
54f0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
5500: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
5510: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
5520: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
5530: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
5540: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
5550: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
5560: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
5570: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
5580: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
5590: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
55a0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
55b0: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
55c0: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
55d0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
55e0: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
55f0: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
5600: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
5610: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5620: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5630: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
5640: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
5650: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
5660: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5670: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
5680: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
5690: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
56a0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
56b0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
56c0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
56d0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
56e0: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74  .  }.  pCur->eSt
56f0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
5700: 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72  ALID;.  rc = btr
5710: 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
5720: 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d  Cur->pKey, pCur-
5730: 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d  >nKey, 0, &pCur-
5740: 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63  >skip);.  if( rc
5750: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5760: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5770: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
5780: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5790: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
57a0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
57b0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
57c0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
57d0: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20  INVALID );.  }. 
57e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
57f0: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
5800: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
5810: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
5820: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5830: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
5840: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
5850: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
5860: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
5870: 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  E_OK)../*.** Det
5880: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
5890: 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68  r not a cursor h
58a0: 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  as moved from th
58b0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a  e position it.**
58c0: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
58d0: 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61   at.  Cursors ca
58e0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
58f0: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
5900: 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64  nting.** at is d
5910: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
5920: 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  under them..**.*
5930: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
5940: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
5950: 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e  code if somethin
5960: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54  g goes wrong.  T
5970: 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70  he.** integer *p
5980: 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20  HasMoved is set 
5990: 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75  to one if the cu
59a0: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61  rsor has moved a
59b0: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  nd 0 if not..*/.
59c0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
59d0: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
59e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
59f0: 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a  nt *pHasMoved){.
5a00: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
5a10: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
5a20: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
5a30: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
5a40: 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20  pHasMoved = 1;. 
5a50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5a60: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
5a70: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
5a80: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70  ID || pCur->skip
5a90: 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61 73  !=0 ){.    *pHas
5aa0: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  Moved = 1;.  }el
5ab0: 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76  se{.    *pHasMov
5ac0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
5ad0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5ae0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
5af0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
5b00: 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  M./*.** Given a 
5b10: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
5b20: 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73   regular databas
5b30: 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74  e page, return t
5b40: 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
5b50: 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65  r for the pointe
5b60: 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20  r-map page that 
5b70: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74  contains the ent
5b80: 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  ry for the.** in
5b90: 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  put page number.
5ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
5bb0: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
5bc0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5bd0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
5be0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
5bf0: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
5c00: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
5c10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5c20: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
5c30: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
5c40: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
5c50: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
5c60: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
5c70: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
5c80: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
5c90: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
5ca0: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
5cb0: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
5cc0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
5cd0: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
5ce0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
5cf0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
5d00: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
5d10: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
5d20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5d30: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
5d40: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
5d50: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
5d60: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
5d70: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
5d80: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
5d90: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
5da0: 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  gno'..** An erro
5db0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
5dc0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
5dd0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
5de0: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
5df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5e00: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
5e10: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
5e20: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
5e30: 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61   parent){.  DbPa
5e40: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a  ge *pDbPage;  /*
5e50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
5e60: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
5e70: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
5e80: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
5e90: 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  data */.  Pgno i
5ea0: 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54  Ptrmap;     /* T
5eb0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
5ec0: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
5ed0: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
5ee0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70    /* Offset in p
5ef0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
5f00: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
5f10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5f20: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5f30: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
5f40: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
5f50: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75  l page number mu
5f60: 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  st never be used
5f70: 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61   as a pointer ma
5f80: 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65  p page */.  asse
5f90: 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53  rt( 0==PTRMAP_IS
5fa0: 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e  PAGE(pBt, PENDIN
5fb0: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
5fc0: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
5fd0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
5fe0: 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20  );.  if( key==0 
5ff0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6000: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
6010: 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  T;.  }.  iPtrmap
6020: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6030: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6040: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6050: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6060: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
6070: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
6080: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
6090: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
60a0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
60b0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
60c0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
60d0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 72  ffset<0 ){.    r
60e0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
60f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
6100: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
6110: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
6120: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
6130: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
6140: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
6150: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
6160: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
6170: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6180: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
6190: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
61a0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
61b0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
61c0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
61d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
61e0: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
61f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
6200: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6210: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6220: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
6230: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
6240: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
6250: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
6260: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
6270: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
6280: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65  f(pDbPage);.  re
6290: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
62a0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
62b0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
62c0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
62d0: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
62e0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
62f0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6300: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6310: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6320: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6330: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6340: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6350: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6360: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6370: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
6380: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
6390: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
63a0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
63b0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
63c0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
63d0: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
63e0: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
63f0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6400: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6410: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6420: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6430: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6440: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6450: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6460: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6470: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
6480: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6490: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
64a0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
64b0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
64c0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
64d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
64e0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
64f0: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6500: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6510: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
6520: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
6530: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
6540: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
6550: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
6560: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6570: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
6580: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
6590: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
65a0: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
65b0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
65c0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
65d0: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
65e0: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
65f0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6600: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
6610: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
6620: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6630: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
6640: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
6650: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
6660: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
6670: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
6680: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6690: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
66a0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
66b0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
66c0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
66d0: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
66e0: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
66f0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
6700: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74  define ptrmapGet
6710: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
6720: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
6730: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78  rmapPutOvflPtr(x
6740: 2c 20 79 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  , y) SQLITE_OK.#
6750: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
6760: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
6770: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
6780: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
6790: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
67a0: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
67b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
67c0: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
67d0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
67e0: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
67f0: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
6800: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
6810: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
6820: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
6830: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6840: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
6850: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
6860: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
6870: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
6880: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
6890: 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f  aData[(P)->cellO
68a0: 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a  ffset+2*(I)]))).
68b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
68c0: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
68d0: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
68e0: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
68f0: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
6900: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
6910: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  w cells..*/.stat
6920: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
6930: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
6940: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
6950: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  l){.  int i;.  a
6960: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6970: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6980: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6990: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
69a0: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
69b0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
69c0: 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f  k;.    struct _O
69d0: 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a  vflCell *pOvfl;.
69e0: 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61      pOvfl = &pPa
69f0: 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20  ge->aOvfl[i];.  
6a00: 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78    k = pOvfl->idx
6a10: 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65  ;.    if( k<=iCe
6a20: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
6a30: 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k==iCell ){.    
6a40: 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c      return pOvfl
6a50: 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d  ->pCell;.      }
6a60: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
6a70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6a80: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
6a90: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
6aa0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
6ab0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
6ac0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
6ad0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
6ae0: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
6af0: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
6b00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
6b10: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
6b20: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
6b30: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
6b40: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6b50: 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65  and btreeParseCe
6b60: 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65  llPtr() .** take
6b70: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
6b80: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  he body of the c
6b90: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
6ba0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
6bb0: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69  * Within this fi
6bc0: 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c  le, the parseCel
6bd0: 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65  l() macro can be
6be0: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
6bf0: 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  of.** btreeParse
6c00: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
6c10: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
6c20: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
6c30: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
6c40: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
6c50: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
6c60: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
6c70: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
6c80: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
6c90: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
6ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
6cb0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
6cc0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
6cd0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
6ce0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
6cf0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
6d00: 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20  /.){.  u16 n;   
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6d20: 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69  * Number bytes i
6d30: 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  n cell content h
6d40: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
6d50: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
6d60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6d70: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
6d80: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
6d90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6da0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
6db0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
6dc0: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
6dd0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
6de0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
6df0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
6e00: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
6e10: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
6e20: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
6e30: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
6e40: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
6e50: 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ey ){.    if( pP
6e60: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
6e70: 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61        n += getVa
6e80: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
6e90: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
6ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
6eb0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20  ayload = 0;.    
6ec0: 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  }.    n += getVa
6ed0: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  rint(&pCell[n], 
6ee0: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
6ef0: 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ey);.    pInfo->
6f00: 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64  nData = nPayload
6f10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6f20: 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b  Info->nData = 0;
6f30: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
6f40: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
6f50: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
6f60: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50  pInfo->nKey = nP
6f70: 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49  ayload;.  }.  pI
6f80: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
6f90: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
6fa0: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
6fb0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
6fc0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
6fd0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
6fe0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
6ff0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
7000: 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79   );.  if( likely
7010: 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65  (nPayload<=pPage
7020: 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20  ->maxLocal) ){. 
7030: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
7040: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
7050: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
7060: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
7070: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
7080: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
7090: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
70a0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
70b0: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
70c0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
70d0: 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  ize of cell cont
70e0: 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ent in bytes */.
70f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79      nSize = nPay
7100: 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49  load + n;.    pI
7110: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7120: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
7130: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7140: 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28  w = 0;.    if( (
7150: 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29  nSize & ~3)==0 )
7160: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
7170: 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e  4;        /* Min
7180: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
7190: 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  s 4 */.    }.   
71a0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
71b0: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65  (u16)nSize;.  }e
71c0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
71d0: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
71e0: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
71f0: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
7200: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
7210: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
7220: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
7230: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
7240: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
7250: 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66  nto.    ** overf
7260: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
7270: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
7280: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
7290: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20  nt of unused.   
72a0: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
72b0: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
72c0: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
72d0: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
72e0: 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20  orage.    ** in 
72f0: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
7300: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
7310: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72     **.    ** War
7320: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
7330: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
7340: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
7350: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
7360: 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72     ** way will r
7370: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
7380: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
7390: 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rmat..    */.   
73a0: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
73b0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
73c0: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
73d0: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
73e0: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
73f0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
7400: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
7410: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
7420: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
7430: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
7440: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
7450: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
7460: 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c  */..    minLocal
7470: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
7480: 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c  al;.    maxLocal
7490: 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   = pPage->maxLoc
74a0: 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20  al;.    surplus 
74b0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50  = minLocal + (nP
74c0: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
74d0: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
74e0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
74f0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
7500: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
7510: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7520: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7530: 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
7540: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
7550: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49  ocal ){.      pI
7560: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7570: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20  16)surplus;.    
7580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
7590: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
75a0: 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  6)minLocal;.    
75b0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
75c0: 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70  erflow = (u16)(p
75d0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e  Info->nLocal + n
75e0: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
75f0: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
7600: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
7610: 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43  }.#define parseC
7620: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
7630: 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72  , pInfo) \.  btr
7640: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
7650: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
7660: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
7670: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61  )), (pInfo)).sta
7680: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
7690: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
76a0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
76b0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
76c0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
76d0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
76f0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
7700: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
7710: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7720: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7730: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7740: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
7750: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
7760: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
7770: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
7780: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7790: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
77a0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
77b0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
77c0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
77d0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
77e0: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
77f0: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
7800: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
7810: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
7820: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
7830: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
7840: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
7850: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
7860: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
7870: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
7880: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7890: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
78a0: 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c  8 *pIter = &pCel
78b0: 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  l[pPage->childPt
78c0: 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53  rSize];.  u32 nS
78d0: 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ize;..#ifdef SQL
78e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
78f0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7900: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
7910: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
7920: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
7930: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
7940: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
7950: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
7960: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
7970: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
7980: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
7990: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
79a0: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
79b0: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
79c0: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
79d0: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
79e0: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
79f0: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
7a00: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
7a10: 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
7a20: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
7a30: 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a  l, &debuginfo);.
7a40: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
7a50: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
7a60: 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20     u8 *pEnd;.   
7a70: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
7a80: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ata ){.      pIt
7a90: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
7aa0: 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b  2(pIter, nSize);
7ab0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7ac0: 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20    nSize = 0;.   
7ad0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72   }..    /* pIter
7ae0: 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74   now points at t
7af0: 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  he 64-bit intege
7b00: 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76  r key value, a v
7b10: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a  ariable length .
7b20: 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
7b30: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7b40: 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20  ock moves pIter 
7b50: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
7b60: 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a  first byte.    *
7b70: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
7b80: 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e  f the key value.
7b90: 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26   */.    pEnd = &
7ba0: 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68  pIter[9];.    wh
7bb0: 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26  ile( (*pIter++)&
7bc0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
7bd0: 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nd );.  }else{. 
7be0: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
7bf0: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e  arint32(pIter, n
7c00: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65  Size);.  }..  te
7c10: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
7c20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7c30: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
7c40: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
7c50: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
7c60: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
7c70: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
7c80: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
7c90: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
7ca0: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
7cb0: 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e  l + (nSize - min
7cc0: 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d  Local) % (pPage-
7cd0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
7ce0: 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63   - 4);.    testc
7cf0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
7d00: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
7d10: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
7d20: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
7d30: 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
7d40: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
7d50: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
7d60: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
7d70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a  ;.    }.    nSiz
7d80: 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53  e += 4;.  }.  nS
7d90: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
7da0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20  er - pCell);..  
7db0: 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  /* The minimum s
7dc0: 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20  ize of any cell 
7dd0: 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  is 4 bytes. */. 
7de0: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a   if( nSize<4 ){.
7df0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20      nSize = 4;. 
7e00: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53   }..  assert( nS
7e10: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
7e20: 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e  Size );.  return
7e30: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23   (u16)nSize;.}.#
7e40: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
7e50: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
7e60: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
7e70: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
7e80: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
7e90: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
7ea0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
7eb0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
7ec0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ed0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7ee0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
7ef0: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
7f00: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
7f10: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
7f20: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
7f30: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
7f40: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
7f50: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
7f60: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
7f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7f80: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
7f90: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7fa0: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43   u8 *pCell){.  C
7fb0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
7fc0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
7fd0: 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
7fe0: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7ff0: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
8000: 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
8010: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
8020: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
8030: 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
8040: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
8050: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
8060: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
8070: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
8080: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
8090: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
80a0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
80b0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
80c0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
80d0: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
80e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
80f0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
8100: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
8110: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
8120: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
8130: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
8140: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
8150: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
8160: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
8170: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
8180: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
8190: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
81a0: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
81b0: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
81c0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
81d0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
81e0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
81f0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
8200: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8230: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8260: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
8270: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
8280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8290: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
82a0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
82b0: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
82c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
82d0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
82e0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
82f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8300: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
8310: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
8320: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
8330: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
8340: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
8350: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
8360: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8390: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
83a0: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
83b0: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
83c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
83d0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
83e0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
83f0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
8400: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8410: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
8420: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
8430: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
8440: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
8450: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
8460: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
8470: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
8480: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
8490: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
84a0: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
84b0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
84c0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
84d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
84e0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
84f0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8500: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8510: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8520: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8530: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8540: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
8550: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
8560: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8570: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
8580: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8590: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
85a0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
85b0: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
85c0: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
85d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
85e0: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
85f0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
8600: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8610: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
8620: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
8630: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
8640: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
8650: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
8660: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
8670: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
8680: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
8690: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
86a0: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
86b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
86c0: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
86d0: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
86e0: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
86f0: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
8700: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
8710: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
8720: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
8730: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
8740: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
8750: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
8760: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
8770: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
8780: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
8790: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
87a0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
87b0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
87c0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
87d0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
87e0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
87f0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8800: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8810: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
8820: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8830: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
8840: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
8850: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
8860: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
8870: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
8880: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
8890: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
88a0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
88b0: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
88c0: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
88d0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
88e0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
88f0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
8900: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8910: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
8920: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
8930: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
8940: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
8950: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
8960: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
8970: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
8980: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
8990: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
89a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
89b0: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
89c0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
89d0: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
89e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
89f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8a00: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
8a10: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
8a20: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
8a30: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
8a40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8a50: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8a60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
8a70: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
8a80: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
8a90: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
8aa0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8ab0: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
8ac0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
8ad0: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
8ae0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
8af0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
8b00: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
8b10: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
8b20: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
8b30: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
8b40: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
8b50: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
8b60: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
8b70: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
8b80: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
8b90: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
8ba0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
8bb0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
8bc0: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
8bd0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
8be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8bf0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
8c00: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
8c10: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
8c20: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
8c30: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
8c40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8c50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
8c60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
8c80: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
8c90: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
8ca0: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
8cb0: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
8cc0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8cd0: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
8ce0: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
8cf0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
8d00: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
8d10: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
8d20: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
8d30: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
8d40: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
8d50: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
8d60: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
8d70: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
8d80: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
8d90: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
8da0: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
8db0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
8dc0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
8dd0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
8de0: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
8df0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
8e00: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
8e10: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
8e20: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
8e30: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
8e40: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
8e50: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
8e60: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
8e70: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
8e80: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
8e90: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
8ea0: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
8eb0: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
8ec0: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
8ed0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
8ee0: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
8ef0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
8f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
8f10: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
8f20: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
8f30: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
8f40: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
8f50: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8f60: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
8f70: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
8f80: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
8f90: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
8fa0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8fb0: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
8fc0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
8fd0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
8fe0: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
9010: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
9020: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
9030: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9050: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9060: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
9070: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61  area */.  int ga
9080: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
9090: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
90a0: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
90b0: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
90c0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntent */.  int r
90d0: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  c;         /* In
90e0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
90f0: 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  e */.  .  assert
9100: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9110: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9120: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
9130: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9140: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
9150: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9160: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9170: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9180: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
9190: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
91a0: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
91b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
91c0: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
91d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
91e0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20  verflow==0 );.. 
91f0: 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64   nFrag = data[hd
9200: 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  r+7];.  assert( 
9210: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
9220: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
9230: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
9240: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
9250: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
9260: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74  Page->nCell;.  t
9270: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
9280: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
9290: 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74  f( gap>top ) ret
92a0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
92b0: 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63  PT_BKPT;.  testc
92c0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
92d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
92e0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
92f0: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
9300: 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61  p );..  if( nFra
9310: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  g>=60 ){.    /* 
9320: 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e  Always defragmen
9330: 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e  t highly fragmen
9340: 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  ted pages */.   
9350: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
9360: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
9370: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9380: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
9390: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
93a0: 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  r+5]);.  }else i
93b0: 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  f( gap+2<=top ){
93c0: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
93d0: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
93e0: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
93f0: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
9400: 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a  o satisfy .    *
9410: 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20 54  * the request. T
9420: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
9430: 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66   made from the f
9440: 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69  irst free slot i
9450: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69  n .    ** the li
9460: 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  st that is large
9470: 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d   enough to accom
9480: 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f  adate it..    */
9490: 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64  .    int pc, add
94a0: 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d  r;.    for(addr=
94b0: 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74  hdr+1; (pc = get
94c0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
94d0: 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b  ]))>0; addr=pc){
94e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
94f0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9500: 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20  [pc+2]);     /* 
9510: 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73 6c 6f  Size of free slo
9520: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  t */.      if( s
9530: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
9540: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69        int x = si
9550: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
9560: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
9570: 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =4 );.        te
9580: 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a  stcase( x==3 );.
9590: 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 34 20          if( x<4 
95a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
95b0: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
95c0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
95d0: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
95e0: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
95f0: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
9600: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
9610: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
9620: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
9630: 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70  a[addr], &data[p
9640: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
9650: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
9660: 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b  (u8)(nFrag + x);
9670: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9690: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
96a0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
96b0: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
96c0: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
96d0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
96e0: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
96f0: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
9700: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
9710: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
9720: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
9730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49     }.        *pI
9740: 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20  dx = pc + x;.   
9750: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9760: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
9770: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
9780: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
9790: 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  e there is enoug
97a0: 68 20 73 70 61 63 65 20 69 6e 20 74 68 65 20 67  h space in the g
97b0: 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20  ap to satisfy.  
97c0: 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ** the allocatio
97d0: 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72  n.  If not, defr
97e0: 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74  agment..  */.  t
97f0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e  estcase( gap+2+n
9800: 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69  Byte==top );.  i
9810: 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74  f( gap+2+nByte>t
9820: 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  op ){.    rc = d
9830: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
9840: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
9850: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9860: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9870: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
9880: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
9890: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
98a0: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
98b0: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
98c0: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
98d0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
98e0: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
98f0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
9900: 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74  t area..  */.  t
9910: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
9920: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
9930: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 2a 70  r+5], top);.  *p
9940: 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74  Idx = top;.  ret
9950: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9960: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
9970: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
9980: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
9990: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
99a0: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
99b0: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
99c0: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
99d0: 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20  aDisk[start].** 
99e0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
99f0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69  the block is "si
9a00: 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ze" bytes..**.**
9a10: 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66   Most of the eff
9a20: 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f  ort here is invo
9a30: 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e  lved in coalesin
9a40: 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72  g adjacent.** fr
9a50: 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61  ee blocks into a
9a60: 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65   single big free
9a70: 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   block..*/.stati
9a80: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
9a90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9aa0: 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73  int start, int s
9ab0: 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ize){.  int addr
9ac0: 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20  , pbegin, hdr;. 
9ad0: 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20   int iLast;     
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f     /* Largest po
9b00: 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b  ssible freeblock
9b10: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73   offset */.  uns
9b20: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
9b30: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9b40: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
9b50: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
9b60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
9b70: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
9b80: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
9b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
9ba0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
9bb0: 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
9bc0: 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73  af?0:4) );.  ass
9bd0: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
9be0: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
9bf0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
9c00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9c10: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9c20: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
9c40: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
9c50: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
9c60: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
9c70: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
9c80: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
9c90: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
9ca0: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
9cb0: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
9cc0: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
9cd0: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
9ce0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
9cf0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
9d00: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
9d10: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
9d20: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
9d30: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
9d40: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
9d50: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68  blocks.  Note th
9d60: 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  at.  ** even tho
9d70: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
9d80: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
9d90: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
9da0: 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65  age(),.  ** btre
9db0: 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20  eInitPage() did 
9dc0: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
9dd0: 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a  apping cells or.
9de0: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20    ** freeblocks 
9df0: 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20  that overlapped 
9e00: 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65  cells.   Nor doe
9e10: 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e  s it detect when
9e20: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63   the.  ** cell c
9e30: 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65  ontent area exce
9e40: 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eds the value in
9e50: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
9e60: 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a  .  If these.  **
9e70: 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73   situations aris
9e80: 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
9e90: 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  nt insert operat
9ea0: 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75  ions might corru
9eb0: 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  pt.  ** the free
9ec0: 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20  list.  So we do 
9ed0: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  need to check fo
9ee0: 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69  r corruption whi
9ef0: 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a  le scanning.  **
9f00: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
9f10: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
9f20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
9f30: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
9f40: 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d    iLast = pPage-
9f50: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
9f60: 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20   - 4;.  assert( 
9f70: 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  start<=iLast );.
9f80: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
9f90: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9fa0: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
9fb0: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
9fc0: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64     if( pbegin<ad
9fd0: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65  dr+4 ){.      re
9fe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9ff0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
a000: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
a010: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65  n;.  }.  if( pbe
a020: 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20  gin>iLast ){.   
a030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a040: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a050: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
a060: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
a070: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
a080: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
a090: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
a0a0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
a0b0: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
a0c0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
a0d0: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
a0e0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
a0f0: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
a100: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
a110: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
a120: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
a130: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
a140: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
a150: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a160: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
a170: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
a180: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
a190: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
a1a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a1b0: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
a1c0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
a1d0: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
a1e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a1f0: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
a200: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a210: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
a220: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
a230: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
a240: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
a250: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
a260: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
a270: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  +psize);.      i
a280: 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28  f( (frag<0) || (
a290: 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68  frag>(int)data[h
a2a0: 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20  dr+7]) ){.      
a2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a2c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61      }.      data
a2e0: 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66  [hdr+7] -= (u8)f
a2f0: 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  rag;.      x = g
a300: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a310: 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74  ext]);.      put
a320: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
a330: 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78  in], x);.      x
a340: 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62   = pnext + get2b
a350: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
a360: 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20  2]) - pbegin;.  
a370: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a380: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29  ta[pbegin+2], x)
a390: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a3a0: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
a3b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a3c0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
a3d0: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
a3e0: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
a3f0: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
a400: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
a410: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
a420: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
a430: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
a440: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
a450: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
a460: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
a470: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
a480: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
a490: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
a4a0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
a4b0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b  (&data[hdr+5]) +
a4c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a4d0: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
a4e0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
a4f0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d  dr+5], top);.  }
a500: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a510: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a520: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a530: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
a540: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a550: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
a560: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
a570: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
a580: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
a590: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
a5a0: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
a5b0: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
a5c0: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
a5d0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
a5e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
a5f0: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
a600: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
a610: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
a620: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
a630: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
a640: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
a650: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
a660: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
a670: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
a680: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
a690: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
a6a0: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
a6b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
a6c0: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
a6d0: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
a6e0: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
a6f0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
a700: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
a710: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
a720: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
a730: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
a740: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a750: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
a760: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
a770: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
a780: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a790: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a7a0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
a7b0: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
a7c0: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
a7d0: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
a7e0: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
a7f0: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
a800: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
a810: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
a820: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
a830: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
a840: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
a850: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
a860: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
a870: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
a880: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
a890: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
a8a0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
a8b0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
a8c0: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
a8d0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
a8e0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
a8f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
a900: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
a910: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
a920: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
a930: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
a940: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
a950: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
a960: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
a970: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
a980: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
a990: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
a9a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a9b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
a9c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a9d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
a9e0: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
a9f0: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
aa00: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
aa10: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
aa20: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
aa30: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
aa40: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
aa50: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
aa60: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
aa70: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
aa80: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
aa90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
aaa0: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
aab0: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
aac0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
aad0: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
aae0: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
aaf0: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
ab00: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
ab10: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
ab20: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
ab30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
ab40: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
ab50: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
ab60: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
ab70: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
ab80: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
ab90: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
aba0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
abb0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
abc0: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
abd0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
abe0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
abf0: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
ac00: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ac10: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ac20: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ac30: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
ac40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
ac50: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
ac60: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
ac70: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
ac80: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
ac90: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
aca0: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
acb0: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
acc0: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
acd0: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
ace0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
acf0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
ad00: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
ad10: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
ad20: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
ad30: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
ad40: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
ad50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
ad60: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
ad70: 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75  ure */.    u16 u
ad80: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
ad90: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
ada0: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
adb0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
adc0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
add0: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
ade0: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
adf0: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
ae00: 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72  r */.    u16 nFr
ae10: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
ae20: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
ae30: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
ae40: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70  e */.    u16 top
ae50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
ae60: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
ae70: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ae80: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
ae90: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
aea0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
aeb0: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
aec0: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
aed0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
aee0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
aef0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
af00: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
af10: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
af20: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
af30: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
af40: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
af50: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
af60: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
af70: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
af80: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
af90: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
afa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
afb0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
afc0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
afd0: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70  <=32768 );.    p
afe0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
aff0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
b000: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   1;.    pPage->n
b010: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
b020: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
b030: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
b040: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
b050: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
b060: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
b070: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
b080: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
b090: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b0a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b0b0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b0c0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b0d0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b0e0: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b0f0: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b100: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b110: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b120: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b130: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b140: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b150: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b160: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b170: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b180: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b190: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b1a0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b1b0: 67 68 74 20 63 61 75 73 65 20 75 73 65 20 74 6f  ght cause use to
b1c0: 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
b1d0: 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67  nd.    ** of pag
b1e0: 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
b1f0: 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a   cell.  .    **.
b200: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
b210: 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  wing block of co
b220: 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20  de checks early 
b230: 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c  to see if a cell
b240: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20   extends.    ** 
b250: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
b260: 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20  a page boundary 
b270: 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54  and causes SQLIT
b280: 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20  E_CORRUPT to be 
b290: 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  .    ** returned
b2a0: 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20   if it does..   
b2b0: 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72   */.    iCellFir
b2c0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
b2d0: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
b2e0: 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20  ;.    iCellLast 
b2f0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
b300: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
b310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
b320: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
b330: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
b340: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
b350: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
b360: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
b370: 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ray */.      int
b380: 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f   sz;           /
b390: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
b3a0: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
b3b0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
b3c0: 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20  ellLast--;.     
b3d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
b3e0: 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
b3f0: 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74          pc = get
b400: 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
b410: 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
b420: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b430: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
b440: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
b450: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
b460: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
b470: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
b480: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
b490: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
b4a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b4b0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
b4c0: 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63  }.        sz = c
b4d0: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
b4e0: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
b4f0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b500: 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
b510: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
b520: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
b530: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
b540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b550: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b560: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b570: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
b580: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
b590: 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69  +;.    }  .#endi
b5a0: 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  f..    /* Comput
b5b0: 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
b5c0: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
b5d0: 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67  ge */.    pc = g
b5e0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b5f0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65  r+1]);.    nFree
b600: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
b610: 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28   top;.    while(
b620: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
b630: 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
b640: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
b650: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
b660: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
b670: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20    /* Free block 
b680: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
b690: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
b6a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b6b0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
b6c0: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
b6d0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
b6e0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
b6f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
b700: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
b710: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
b720: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
b730: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
b740: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
b750: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  scending order *
b760: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
b770: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b780: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
b790: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
b7a0: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
b7b0: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
b7c0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
b7d0: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
b7e0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
b7f0: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
b800: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
b810: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
b820: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
b830: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
b840: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
b850: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
b860: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
b870: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
b880: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
b890: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
b8a0: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
b8b0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
b8c0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
b8d0: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
b8e0: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
b8f0: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
b900: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
b910: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
b920: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
b930: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
b940: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
b950: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
b960: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
b970: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
b980: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
b990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b9a0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
b9b0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
b9c0: 65 20 3d 20 6e 46 72 65 65 20 2d 20 69 43 65 6c  e = nFree - iCel
b9d0: 6c 46 69 72 73 74 3b 0a 20 20 20 20 70 50 61 67  lFirst;.    pPag
b9e0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
b9f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
ba00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ba10: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
ba20: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
ba30: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
ba40: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
ba50: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
ba60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
ba70: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
ba80: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
ba90: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
baa0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
bab0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
bac0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
bad0: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
bae0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
baf0: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
bb00: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
bb10: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
bb20: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
bb30: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
bb40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
bb50: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
bb60: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
bb70: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
bb80: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
bb90: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
bba0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
bbb0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
bbc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
bbd0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
bbe0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
bbf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
bc00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
bc10: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
bc20: 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b   /*memset(&data[
bc30: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
bc40: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
bc50: 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  */.  data[hdr] =
bc60: 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
bc70: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20  first = hdr + 8 
bc80: 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f  + 4*((flags&PTF_
bc90: 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a  LEAF)==0 ?1:0);.
bca0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
bcb0: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
bcc0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
bcd0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
bce0: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
bcf0: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
bd00: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
bd10: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
bd20: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
bd30: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
bd40: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
bd50: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
bd60: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bd70: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
bd80: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
bd90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
bda0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
bdb0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
bdc0: 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67  =32768 );.  pPag
bdd0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
bde0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
bdf0: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
be00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
be10: 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
be20: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
be30: 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
be40: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
be50: 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
be60: 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
be70: 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
be80: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
be90: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
bea0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
beb0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
bec0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
bed0: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
bee0: 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
bef0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
bf00: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
bf10: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
bf20: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
bf30: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  age);.  pPage->p
bf40: 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
bf50: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d  ;.  pPage->pBt =
bf60: 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70   pBt;.  pPage->p
bf70: 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50  gno = pgno;.  pP
bf80: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
bf90: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
bfa0: 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74  ? 100 : 0;.  ret
bfb0: 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
bfc0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
bfd0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
bfe0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
bff0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
c000: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
c010: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
c020: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
c030: 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
c040: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
c050: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
c060: 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74   care about.** t
c070: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
c080: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
c090: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
c0a0: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
c0b0: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
c0c0: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
c0d0: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
c0e0: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
c0f0: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
c100: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
c110: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
c120: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
c130: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
c140: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
c150: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
c160: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
c170: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
c180: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
c190: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
c1a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
c1b0: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
c1c0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
c1d0: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
c1e0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
c1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c200: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
c210: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
c220: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
c230: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
c240: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
c250: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
c260: 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
c270: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61     /* Do not loa
c280: 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  d page content i
c290: 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
c2a0: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
c2b0: 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
c2c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c2d0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
c2e0: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
c2f0: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
c300: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
c310: 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
c320: 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65  pDbPage, noConte
c330: 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
c340: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
c350: 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
c360: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
c370: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
c380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c390: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
c3a0: 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
c3b0: 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
c3c0: 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
c3d0: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
c3e0: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
c3f0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
c400: 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
c410: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
c420: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
c430: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
c440: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
c450: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
c460: 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
c470: 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
c480: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
c490: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
c4a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c4b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
c4c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
c4d0: 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
c4e0: 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
c4f0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
c500: 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
c510: 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
c520: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
c530: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
c540: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
c550: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
c560: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
c570: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c580: 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
c590: 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
c5a0: 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
c5b0: 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
c5c0: 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
c5d0: 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67  ic Pgno pagerPag
c5e0: 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
c5f0: 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61  *pBt){.  int nPa
c600: 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  ge = -1;.  int r
c610: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  c;.  assert( pBt
c620: 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63  ->pPage1 );.  rc
c630: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
c640: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
c650: 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
c660: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
c670: 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d  ITE_OK || nPage=
c680: 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  =-1 );.  return 
c690: 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a  (Pgno)nPage;.}..
c6a0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
c6b0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
c6c0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
c6d0: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
c6e0: 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f  .** is just a co
c6f0: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
c700: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
c710: 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 62 74  e calls to.** bt
c720: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
c730: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
c740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c750: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
c760: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
c770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c780: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
c790: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
c7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c7b0: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
c7c0: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
c7d0: 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  ge **ppPage     
c7e0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
c7f0: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
c800: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
c810: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
c820: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c830: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c840: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c850: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
c860: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c870: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c880: 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
c890: 6f 66 74 65 6e 20 74 68 65 20 63 61 73 65 20 74  often the case t
c8a0: 68 61 74 20 74 68 65 20 70 61 67 65 20 77 65 20  hat the page we 
c8b0: 77 61 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20  want is already 
c8c0: 69 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49  in cache..  ** I
c8d0: 66 20 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72  f so, get it dir
c8e0: 65 63 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76  ectly.  This sav
c8f0: 65 73 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e  es us from havin
c900: 67 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70  g to call.  ** p
c910: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20  agerPagecount() 
c920: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e  to make sure pgn
c930: 6f 20 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69  o is within limi
c940: 74 73 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74  ts, which result
c950: 73 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73  s.  ** in a meas
c960: 75 72 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61  ureable performa
c970: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73  nce improvements
c980: 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ..  */.  *ppPage
c990: 20 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65   = pPage = btree
c9a0: 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
c9b0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
c9c0: 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67  ge ){.    /* Pag
c9d0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
c9e0: 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 72 63 20  cache */.    rc 
c9f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
ca00: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67  else{.    /* Pag
ca10: 65 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  e not in cache. 
ca20: 20 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a   Acquire it. */.
ca30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 67      testcase( pg
ca40: 6e 6f 3d 3d 70 61 67 65 72 50 61 67 65 63 6f 75  no==pagerPagecou
ca50: 6e 74 28 70 42 74 29 20 29 3b 0a 20 20 20 20 69  nt(pBt) );.    i
ca60: 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67  f( pgno>pagerPag
ca70: 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
ca80: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ca90: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
caa0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d   .    }.    rc =
cab0: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
cac0: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
cad0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
cae0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
caf0: 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61 67 65   pPage = *ppPage
cb00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
cb10: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
cb20: 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
cb30: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
cb40: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
cb50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65  E_OK ){.    rele
cb60: 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
cb70: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
cb80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
cb90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
cba0: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
cbb0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
cbc0: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
cbd0: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
cbe0: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
cbf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cc00: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
cc10: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
cc20: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
cc30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cc40: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
cc50: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
cc60: 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e  Refcount(pPage->
cc70: 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20  pDbPage)>1 );.  
cc80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
cc90: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
cca0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
ccb0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ccc0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
ccd0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
cce0: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
ccf0: 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Page );.    asse
cd00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
cd10: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
cd20: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
cd30: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
cd40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cd50: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
cd60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cd70: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
cd80: 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ref(pPage->pDbPa
cd90: 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
cda0: 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
cdb0: 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
cdc0: 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
cdd0: 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
cde0: 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
cdf0: 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
ce00: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
ce10: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
ce20: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
ce30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ce40: 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
ce50: 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
ce60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
ce70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ce80: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
ce90: 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
cea0: 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
ceb0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
cec0: 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
ced0: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
cee0: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
cef0: 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
cf00: 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20  bPage *pData){. 
cf10: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
cf20: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
cf30: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
cf40: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
cf50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
cf60: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
cf70: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
cf80: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
cf90: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
cfa0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cfb0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
cfc0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cfd0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
cfe0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
cff0: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
d000: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29  count(pData)>1 )
d010: 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  {.      /* pPage
d020: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20   might not be a 
d030: 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20  btree page;  it 
d040: 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72  might be an over
d050: 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
d060: 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67  ** or ptrmap pag
d070: 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65  e or a free page
d080: 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65  .  In those case
d090: 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
d0a0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
d0b0: 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  o btreeInitPage(
d0c0: 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  ) will likely re
d0d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d0e0: 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75  UPT..      ** Bu
d0f0: 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e  t no harm is don
d100: 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20  e by this.  And 
d110: 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72  it is very impor
d120: 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20  tant that.      
d130: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
d140: 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  () be called on 
d150: 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65  every btree page
d160: 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20   so we make.    
d170: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f    ** the call fo
d180: 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  r every page tha
d190: 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72  t comes in for r
d1a0: 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  e-initing. */.  
d1b0: 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
d1c0: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
d1d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
d1e0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
d1f0: 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65  dler for a btree
d200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d210: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
d220: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
d230: 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
d240: 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a  pBt = (BtShared*
d250: 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28  )pArg;.  assert(
d260: 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73   pBt->db );.  as
d270: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d280: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62  tex_held(pBt->db
d290: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
d2a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f  turn sqlite3Invo
d2b0: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70  keBusyHandler(&p
d2c0: 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64  Bt->db->busyHand
d2d0: 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ler);.}../*.** O
d2e0: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
d2f0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
d300: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
d310: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
d320: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
d330: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
d340: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
d350: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61  with a random na
d360: 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  me is created.  
d370: 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61  This randomly na
d380: 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  med.** database 
d390: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
d3a0: 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65  eted when sqlite
d3b0: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
d3c0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a   called..** If z
d3d0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
d3e0: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
d3f0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
d400: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
d410: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
d420: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
d430: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
d440: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
d450: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
d460: 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68  ady opened in th
d470: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
d480: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e  connection.** an
d490: 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72  d we are in shar
d4a0: 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed cache mode, t
d4b0: 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c  hen the open wil
d4c0: 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a  l fail with an.*
d4d0: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
d4e0: 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63  INT error.  We c
d4f0: 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20  annot allow two 
d500: 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64  or more BtShared
d510: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  .** objects in t
d520: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
d530: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
d540: 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20  e doing so will 
d550: 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c  lead.** to probl
d560: 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ems with locking
d570: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d580: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e  BtreeOpen(.  con
d590: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
d5a0: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
d5b0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
d5c0: 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
d5d0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
d5e0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
d5f0: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
d600: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
d610: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
d620: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f  pBtree,        /
d630: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
d640: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
d650: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
d660: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
d670: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
d680: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  ns */.  int vfsF
d690: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
d6a0: 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
d6b0: 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
d6c0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
d6d0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
d6e0: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20  fs *pVfs;       
d6f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
d700: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
d710: 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68   btree */.  BtSh
d720: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
d730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
d740: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
d750: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
d760: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
d790: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
d7a0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
d7b0: 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
d7c0: 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
d7d0: 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
d7e0: 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
d7f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
d800: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
d810: 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
d820: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
d830: 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d850: 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
d860: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
d870: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
d880: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
d890: 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
d8a0: 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
d8b0: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 74  t */..  /* Set t
d8c0: 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
d8d0: 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
d8e0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
d8f0: 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
d900: 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
d910: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
d920: 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20   This symbol is 
d930: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66  only required if
d940: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20  .  ** either of 
d950: 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 61 20  the shared-data 
d960: 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65  or autovacuum fe
d970: 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69  atures are compi
d980: 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  led .  ** into t
d990: 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f  he library..  */
d9a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d9b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
d9c0: 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69  _CACHE) || !defi
d9d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d9e0: 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69  AUTOVACUUM).  #i
d9f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
da00: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f  _MEMORYDB.    co
da10: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
da20: 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20  = 0;.  #else.   
da30: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
da40: 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26  db = zFilename &
da50: 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  & !strcmp(zFilen
da60: 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
da70: 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69  ;.  #endif.#endi
da80: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
da90: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
daa0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
dab0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
dac0: 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70  ..  pVfs = db->p
dad0: 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  Vfs;.  p = sqlit
dae0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
daf0: 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
db00: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
db10: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
db20: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
db30: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
db40: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
db50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
db60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
db70: 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
db80: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
db90: 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
dba0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
dbb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
dbc0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
dbd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
dbe0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
dbf0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
dc00: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
dc10: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
dc20: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
dc30: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
dc40: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
dc50: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
dc60: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
dc70: 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26  f( isMemdb==0 &&
dc80: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
dc90: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
dca0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
dcb0: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
dcc0: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
dcd0: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
dce0: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
dcf0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
dd00: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
dd10: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
dd20: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
dd30: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
dd40: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
dd50: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
dd60: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
dd70: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
dd80: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
dd90: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66  dCache;.      if
dda0: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
ddb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ddc0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
ddd0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
dde0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
ddf0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
de00: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
de10: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
de20: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
de30: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
de40: 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
de50: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
de60: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
de70: 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
de80: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
de90: 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
dea0: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
deb0: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
dec0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
ded0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
dee0: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
def0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
df00: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
df10: 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
df20: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
df30: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
df40: 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
df50: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
df60: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
df70: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
df80: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
df90: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
dfa0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
dfb0: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
dfc0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
dfd0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
dfe0: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
dff0: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
e000: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
e010: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
e020: 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b=db->nDb-1; iDb
e030: 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20  >=0; iDb--){.   
e040: 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a           Btree *
e050: 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e  pExisting = db->
e060: 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
e070: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
e080: 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73  xisting && pExis
e090: 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29  ting->pBt==pBt )
e0a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e0b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e0c0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
e0d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e0e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e0f0: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e110: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
e120: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e130: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e140: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
e150: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e160: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
e170: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e180: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e190: 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
e1a0: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  Bt;.          pB
e1b0: 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
e1c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
e1f0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
e200: 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  red);.      sqli
e210: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
e220: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  thname);.    }.#
e230: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
e240: 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
e250: 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d     /* In debug m
e260: 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c  ode, we mark all
e270: 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61   persistent data
e280: 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c  bases as sharabl
e290: 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
e2a0: 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f  when they are no
e2b0: 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  t.  This exercis
e2c0: 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
e2d0: 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ode and.      **
e2e0: 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f   gives more oppo
e2f0: 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65  rtunity for asse
e300: 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rts(sqlite3_mute
e310: 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20  x_held()).      
e320: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  ** statements to
e330: 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72   find locking pr
e340: 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f  oblems..      */
e350: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
e360: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  le = 1;.    }.#e
e370: 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
e380: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
e390: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
e3a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
e3b0: 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
e3c0: 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
e3d0: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
e3e0: 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  are.    ** the r
e3f0: 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
e400: 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
e410: 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
e420: 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
e430: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
e440: 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ing on a differe
e450: 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nt architecture.
e460: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
e470: 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d  rt( sizeof(i64)=
e480: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34  =8 || sizeof(i64
e490: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
e4a0: 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
e4b0: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34  =8 || sizeof(u64
e4c0: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
e4d0: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
e4e0: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
e4f0: 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
e500: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e510: 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
e520: 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
e530: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
e540: 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
e550: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
e560: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
e570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e580: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
e590: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
e5a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
e5b0: 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
e5c0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
e5d0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
e600: 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a  ags, vfsFlags);.
e610: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e620: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
e630: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e640: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
e650: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
e660: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
e670: 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
e680: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e690: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
e6a0: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
e6b0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
e6c0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73  ->db = db;.    s
e6d0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
e6e0: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
e6f0: 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
e700: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
e710: 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
e720: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71  = pBt;.  .    sq
e730: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
e740: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
e750: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
e760: 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
e770: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
e780: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
e790: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
e7a0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
e7b0: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
e7c0: 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  r);.    pBt->pag
e7d0: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
e7e0: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
e7f0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
e800: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
e810: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
e820: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
e830: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
e840: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
e850: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
e860: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
e870: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
e880: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e890: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
e8a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
e8b0: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
e8c0: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
e8d0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
e8e0: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
e8f0: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
e900: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
e910: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
e920: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
e930: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
e940: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
e950: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
e960: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
e970: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
e980: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
e990: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
e9a0: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
e9b0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
e9c0: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
e9d0: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
e9e0: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
e9f0: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
ea00: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
ea10: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
ea20: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
ea30: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
ea40: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
ea50: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
ea60: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
ea70: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
ea80: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
ea90: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
eaa0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
eab0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
eac0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
ead0: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
eae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
eaf0: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
eb00: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
eb10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
eb20: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
eb30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
eb40: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
eb50: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
eb60: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
eb70: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
eb80: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
eb90: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
eba0: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
ebb0: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
ebc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
ebd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
ebe0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
ebf0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
ec00: 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
ec10: 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
ec20: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
ec30: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
ec40: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
ec50: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
ec60: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
ec70: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
ec80: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
ec90: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
eca0: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
ecb0: 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
ecc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ecd0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
ece0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
ecf0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
ed00: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
ed10: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
ed20: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
ed30: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
ed40: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
ed50: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
ed60: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
ed70: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
ed80: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
ed90: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
eda0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
edb0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
edc0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
edd0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
ede0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
edf0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
ee00: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
ee10: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
ee20: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
ee30: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
ee40: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
ee50: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
ee60: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
ee70: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
ee80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ee90: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
eea0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
eeb0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
eec0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
eed0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
eee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
eef0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ef00: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
ef10: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
ef20: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
ef30: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
ef40: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
ef50: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
ef60: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
ef70: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
ef80: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
ef90: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
efa0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
efb0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
efc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
efd0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
efe0: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
eff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
f000: 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
f010: 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
f020: 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
f030: 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
f040: 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
f050: 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
f060: 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
f070: 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
f080: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
f090: 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
f0a0: 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
f0b0: 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
f0c0: 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
f0d0: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
f0e0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
f0f0: 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
f100: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
f110: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
f120: 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
f130: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
f140: 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
f150: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
f160: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
f170: 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
f180: 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
f190: 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
f1a0: 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
f1b0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
f1c0: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
f1d0: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
f1e0: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
f1f0: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
f200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f210: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
f220: 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
f230: 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
f240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f250: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
f260: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
f270: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
f280: 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
f290: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
f2a0: 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
f2b0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
f2c0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
f2d0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
f2e0: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
f2f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
f300: 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
f310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f320: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
f330: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f340: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
f350: 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
f360: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f370: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
f380: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
f390: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
f3a0: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
f3b0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
f3c0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
f3d0: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
f3e0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
f3f0: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
f400: 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
f410: 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
f420: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f430: 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
f440: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
f450: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
f460: 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
f470: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f480: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
f490: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
f4a0: 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
f4b0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
f4c0: 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
f4d0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
f4e0: 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
f4f0: 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
f500: 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
f510: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
f520: 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
f530: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
f540: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
f550: 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
f560: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
f570: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
f580: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
f590: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f5a0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
f5b0: 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  E.  sqlite3_mute
f5c0: 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74  x *pMaster;.  Bt
f5d0: 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
f5e0: 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
f5f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
f600: 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
f610: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
f620: 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71  ;.  pMaster = sq
f630: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
f640: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
f650: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73  TIC_MASTER);.  s
f660: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f670: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
f680: 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
f690: 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
f6a0: 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
f6b0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f6c0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f6d0: 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
f6e0: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
f6f0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
f700: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
f710: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
f720: 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
f730: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
f740: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
f750: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
f760: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
f770: 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
f780: 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
f790: 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
f7a0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
f7b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
f7c0: 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
f7d0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
f7e0: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
f7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f800: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
f810: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
f820: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
f830: 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
f840: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
f850: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
f860: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f870: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
f880: 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
f890: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
f8a0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
f8b0: 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
f8c0: 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
f8d0: 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
f8e0: 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
f8f0: 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e  SIZE(pBt) bytes.
f900: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f910: 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
f920: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
f930: 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
f940: 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
f950: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
f960: 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
f970: 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
f980: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
f990: 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
f9a0: 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
f9b0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
f9c0: 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
f9d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
f9e0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
f9f0: 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ee( pBt->pTmpSpa
fa00: 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70  ce);.  pBt->pTmp
fa10: 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Space = 0;.}../*
fa20: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
fa30: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
fa40: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
fa50: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
fa60: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
fa70: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
fa80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
fa90: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
faa0: 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
fab0: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
fac0: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
fad0: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
fae0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
faf0: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
fb00: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
fb10: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
fb20: 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
fb30: 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
fb40: 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
fb50: 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
fb60: 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
fb70: 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
fb80: 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
fb90: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
fba0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
fbb0: 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
fbc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
fbd0: 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
fbe0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
fbf0: 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
fc00: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
fc10: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
fc20: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
fc30: 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
fc40: 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
fc50: 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
fc60: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
fc70: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
fc80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
fc90: 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
fca0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
fcb0: 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
fcc0: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
fcd0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
fce0: 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
fcf0: 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
fd00: 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
fd10: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
fd20: 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
fd30: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
fd40: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
fd50: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
fd60: 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
fd70: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
fd80: 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
fd90: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
fda0: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
fdb0: 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
fdc0: 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
fdd0: 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
fde0: 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
fdf0: 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
fe00: 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
fe10: 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
fe20: 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
fe30: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
fe40: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
fe50: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
fe60: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
fe70: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
fe80: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
fe90: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
fea0: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
feb0: 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
fec0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
fed0: 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
fee0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
fef0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ff00: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
ff10: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
ff20: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
ff30: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
ff40: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
ff50: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
ff60: 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
ff70: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
ff80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
ff90: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
ffa0: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
ffb0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
ffc0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
ffd0: 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
ffe0: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
fff0: 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
10000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
10010 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10020 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
10030 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
10040 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
10050 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
10060 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
10070 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
10080 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
10090 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
100a0 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
100b0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
100c0 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
100d0 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
100e0 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
100f0 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
10100 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
10110 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
10120 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
10130 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
10140 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
10150 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
10160 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
10170 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
10180 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
10190 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
101a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
101b0 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
101c0 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
101d0 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
101e0 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
101f0 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
10200 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
10210 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
10220 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
10230 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
10240 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
10250 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
10260 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
10270 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
10280 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
10290 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
102a0 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
102b0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
102c0 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
102d0 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
102e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
102f0 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
10300 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
10310 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
10320 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10330 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10340 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
10350 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
10360 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10370 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
10380 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
10390 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
103a0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
103b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
103c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
103d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
103e0 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
103f0 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
10400 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
10410 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
10420 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
10430 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
10440 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
10450 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
10460 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
10470 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
10480 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
10490 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
104a0 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
104b0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
104c0 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
104d0 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
104e0 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
104f0 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
10500 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
10510 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
10520 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
10530 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
10540 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
10550 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
10560 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
10570 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
10580 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
10590 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
105a0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
105b0 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
105c0 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
105d0 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
105e0 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
105f0 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
10600 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10610 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
10620 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10630 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10640 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10650 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
10660 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
10670 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
10680 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
10690 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
106a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
106b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
106c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
106d0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
106e0 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
106f0 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
10700 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
10710 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
10720 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
10730 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
10740 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
10750 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10760 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
10770 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
10780 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10790 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
107a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
107b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
107c0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
107d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
107e0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
107f0 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
10800 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
10810 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
10820 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
10830 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10840 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10850 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
10860 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10870 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
10880 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
10890 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
108a0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
108b0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
108c0 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
108d0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
108e0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
108f0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
10900 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
10910 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
10920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
10930 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
10940 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
10950 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
10960 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
10970 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
10980 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
10990 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
109a0 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
109b0 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
109c0 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
109d0 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
109e0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
109f0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
10a00 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
10a10 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
10a20 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
10a30 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
10a40 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
10a50 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
10a60 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
10a70 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
10a80 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
10a90 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
10aa0 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
10ab0 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
10ac0 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
10ad0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
10ae0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
10af0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
10b00 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
10b10 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
10b20 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
10b30 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
10b40 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
10b50 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
10b60 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
10b70 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46  en the pageSizeF
10b80 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  ixed flag is set
10b90 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
10ba0 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
10bb0 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
10bc0 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
10bd0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
10be0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
10bf0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
10c00 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
10c10 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
10c20 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
10c30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10c40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
10c50 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
10c60 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
10c70 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
10c80 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10c90 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
10ca0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
10cb0 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
10cc0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10ce0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
10cf0 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
10d00 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
10d10 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
10d20 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
10d30 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
10d40 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
10d50 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
10d60 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
10d70 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
10d80 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
10d90 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
10da0 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
10db0 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
10dc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
10dd0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
10de0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
10df0 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
10e00 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
10e10 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
10e20 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
10e30 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
10e40 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
10e50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10e60 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
10e70 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
10e80 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
10e90 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
10ea0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
10eb0 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
10ec0 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
10ed0 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53  Fix ) pBt->pageS
10ee0 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20  izeFixed = 1;.  
10ef0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10f00 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
10f10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
10f20 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
10f30 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
10f40 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
10f50 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
10f60 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
10f70 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
10f80 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
10f90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
10fa0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
10fb0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
10fc0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
10fd0 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
10fe0 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
10ff0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
11000 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
11010 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
11020 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
11030 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
11040 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
11050 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
11060 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
11070 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11080 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
11090 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
110a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
110b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
110c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
110d0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
110e0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
110f0 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
11100 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
11110 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
11120 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
11130 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
11140 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
11150 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
11160 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
11170 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
11180 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
11190 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
111a0 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
111b0 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
111c0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
111d0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
111e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
111f0 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
11200 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
11210 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
11220 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
11230 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11240 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e   return n;.}.#en
11250 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
11260 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11270 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
11280 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11290 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
112a0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
112b0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
112c0 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
112d0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
112e0 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
112f0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
11300 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
11310 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
11320 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
11330 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
11340 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
11350 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
11360 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
11370 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
11380 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
11390 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
113a0 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
113b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
113c0 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
113d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
113e0 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
113f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11400 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
11410 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
11420 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
11430 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11440 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11450 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
11460 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
11470 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
11480 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
11490 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
114a0 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  ed && (av ?1:0)!
114b0 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
114c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
114d0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
114e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
114f0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
11500 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
11510 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
11520 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
11530 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11540 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
11550 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
11560 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
11570 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
11580 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
11590 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
115a0 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
115b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
115c0 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
115d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
115e0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
115f0 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
11600 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
11610 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
11620 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
11630 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
11640 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
11650 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
11660 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
11670 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
11680 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
11690 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
116a0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
116b0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
116c0 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
116d0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
116e0 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
116f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11700 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
11710 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
11720 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
11730 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
11740 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
11750 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
11760 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
11770 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
11780 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
11790 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
117a0 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
117b0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
117c0 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
117d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
117e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
117f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
11800 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
11810 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
11820 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
11830 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
11840 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
11850 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
11860 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
11870 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
11880 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
11890 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
118a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
118b0 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
118c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
118d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
118e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
118f0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
11900 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  =0 );.  rc = btr
11910 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
11920 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
11930 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11940 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
11950 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
11960 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
11970 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
11980 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
11990 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
119a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
119b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
119c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
119d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
119e0 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
119f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11a00 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11a10 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c  it_failed;.  }el
11a20 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  se if( nPage>0 )
11a30 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69  {.    int pageSi
11a40 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62  ze;.    int usab
11a50 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
11a60 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
11a70 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
11a80 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
11a90 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
11aa0 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
11ab0 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
11ac0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11ad0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
11ae0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
11af0 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
11b00 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
11b10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11b20 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
11b30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
11b40 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
11b50 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  }..    /* The ma
11b60 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66  ximum embedded f
11b70 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
11b80 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e  exactly 25%.  An
11b90 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20  d the minimum.  
11ba0 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72    ** embedded fr
11bb0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31  action must be 1
11bc0 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65  2.5% for both le
11bd0 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d  af-data and non-
11be0 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a  leaf-data..    *
11bf0 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
11c00 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
11c10 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
11c20 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
11c30 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
11c40 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
11c50 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
11c60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11c70 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
11c80 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
11c90 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
11ca0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11cb0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
11cc0 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
11cd0 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
11ce0 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
11cf0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
11d00 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
11d10 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20  ize<512 ||.     
11d20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50     (SQLITE_MAX_P
11d30 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26  AGE_SIZE<32768 &
11d40 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  & pageSize>SQLIT
11d50 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
11d60 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
11d70 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
11d80 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
11d90 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
11da0 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
11db0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
11dc0 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
11dd0 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  0];.    if( page
11de0 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
11df0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
11e00 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
11e10 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
11e20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
11e30 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
11e40 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
11e50 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
11e60 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
11e70 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
11e80 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
11e90 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
11ea0 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
11eb0 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
11ec0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
11ed0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
11ee0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
11ef0 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
11f00 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
11f10 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
11f20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
11f30 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
11f40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11f50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
11f60 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
11f70 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75  >usableSize = (u
11f80 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  16)usableSize;. 
11f90 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
11fa0 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
11fb0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
11fc0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11fe0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
11ff0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
12000 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
12040 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
12050 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
12060 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
12070 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
12080 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
12090 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
120a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
120b0 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
120c0 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
120d0 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65  ze = (u16)usable
120e0 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
120f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12100 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
12110 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
12120 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
12130 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
12140 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
12150 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
12160 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
12170 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
12180 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
12190 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
121a0 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
121b0 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
121c0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
121d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
121e0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
121f0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
12200 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
12210 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
12220 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
12230 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
12240 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
12250 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
12260 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
12270 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
12280 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
12290 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
122a0 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
122b0 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
122c0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
122d0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
122e0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
122f0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
12300 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
12310 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
12320 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
12330 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
12340 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65  yte poiner, a he
12350 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
12360 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
12370 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
12380 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
12390 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
123a0 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
123b0 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
123c0 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
123d0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
123e0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
123f0 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
12400 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
12410 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
12420 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
12430 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78  - 23;.  pBt->max
12440 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62  Leaf = pBt->usab
12450 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70  leSize - 35;.  p
12460 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70  Bt->minLeaf = (p
12470 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
12480 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*32/255 - 23;.
12490 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
124a0 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
124b0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
124c0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
124d0 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65  1 = pPage1;.  re
124e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
124f0 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
12500 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
12510 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
12520 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
12530 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12540 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
12550 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
12560 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
12570 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
12580 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
12590 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
125a0 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
125b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
125c0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
125d0 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
125e0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
125f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12600 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
12610 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
12620 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
12630 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
12640 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
12650 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
12660 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
12670 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
12680 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
12690 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
126a0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
126b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
126c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
126d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
126e0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
126f0 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  sor==0 || pBt->i
12700 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
12710 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
12720 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
12730 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
12740 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
12750 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
12760 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
12770 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
12780 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
12790 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
127a0 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  ger)==1 );.    a
127b0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
127c0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
127d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
127e0 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70  ->pPage1);.    p
127f0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
12800 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
12810 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ate a new databa
12820 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
12830 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
12840 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
12850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12860 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
12870 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
12880 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
12890 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
128a0 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  a;.  int rc;.  i
128b0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
128c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
128d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
128e0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
128f0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12900 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
12910 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
12920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
12930 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
12940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12950 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
12960 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
12970 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
12980 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
12990 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
129a0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
129b0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
129c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
129d0 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
129e0 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
129f0 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
12a00 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
12a10 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
12a20 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
12a30 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
12a40 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
12a50 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
12a60 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
12a70 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
12a80 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
12a90 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
12aa0 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
12ab0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
12ac0 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
12ad0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
12ae0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
12af0 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
12b00 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
12b10 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
12b20 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
12b30 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
12b40 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
12b50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
12b60 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
12b70 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
12b80 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
12b90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12ba0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
12bb0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
12bc0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
12bd0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
12be0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12bf0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
12c00 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
12c10 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
12c20 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
12c30 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
12c40 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
12c50 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
12c60 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
12c70 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
12c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12c90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  K;.}../*.** Atte
12ca0 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
12cb0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
12cc0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
12cd0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
12ce0 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
12cf0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
12d00 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
12d10 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
12d20 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
12d30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
12d40 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
12d50 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
12d60 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
12d70 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
12d80 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
12d90 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
12da0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
12db0 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
12dc0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
12dd0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
12de0 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
12df0 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
12e00 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
12e10 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
12e20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
12e30 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
12e40 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
12e50 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
12e60 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
12e70 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
12e80 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
12e90 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
12ea0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
12eb0 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
12ec0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
12ed0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
12ee0 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
12ef0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
12f00 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
12f10 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
12f20 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
12f30 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
12f40 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
12f50 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
12f60 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
12f70 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
12f80 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
12f90 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
12fa0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
12fb0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
12fc0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
12fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12fe0 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
12ff0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
13000 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
13010 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
13020 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
13030 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
13040 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
13050 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
13060 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
13070 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
13080 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
13090 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
130a0 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
130b0 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
130c0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
130d0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
130e0 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
130f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
13100 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
13110 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
13120 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
13130 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
13140 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
13150 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
13160 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
13170 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
13180 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
13190 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
131a0 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
131b0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
131c0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
131d0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
131e0 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
131f0 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
13200 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
13210 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
13220 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
13230 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
13240 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
13250 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
13260 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
13270 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
13280 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
13290 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
132a0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
132b0 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
132c0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
132d0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
132e0 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
132f0 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
13300 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
13310 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
13320 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
13330 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
13340 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
13350 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
13360 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
13370 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  k = 0;.  BtShare
13380 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
13390 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
133a0 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
133b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
133c0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
133d0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
133e0 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
133f0 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
13400 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
13410 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
13420 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
13430 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
13440 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
13450 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
13460 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
13470 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13480 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
13490 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
134a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
134b0 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
134c0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
134d0 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  gun;.  }..  /* W
134e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
134f0 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
13500 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
13510 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
13520 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
13530 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  y && wrflag ){. 
13540 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
13550 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
13560 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
13570 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
13580 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13590 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
135a0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
135b0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
135c0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
135d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
135e0 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
135f0 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
13600 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
13610 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
13620 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
13630 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
13640 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
13650 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
13660 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13670 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20  n==TRANS_WRITE) 
13680 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e  || pBt->isPendin
13690 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20  g ){.    pBlock 
136a0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
136b0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
136c0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
136d0 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
136e0 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
136f0 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
13700 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
13710 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
13720 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
13730 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
13740 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
13750 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
13760 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13770 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
13780 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
13790 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
137a0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
137b0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
137c0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
137d0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
137e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
137f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13800 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
13810 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
13820 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
13830 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
13840 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
13850 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
13860 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
13870 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
13880 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
13890 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
138a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
138b0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
138c0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
138d0 21 3d 28 72 63 20 3d 20 71 75 65 72 79 53 68 61  !=(rc = querySha
138e0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
138f0 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
13900 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 29 20 29 7b  , READ_LOCK)) ){
13910 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
13920 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 64 6f  begun;.  }..  do
13930 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
13940 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
13950 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
13960 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
13970 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
13980 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
13990 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
139a0 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
139b0 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
139c0 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
139d0 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
139e0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
139f0 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
13a00 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
13a10 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
13a20 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
13a30 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
13a40 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
13a50 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
13a60 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
13a70 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
13a80 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
13a90 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
13aa0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
13ab0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
13ac0 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
13ad0 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
13ae0 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
13af0 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
13b00 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
13b10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13b20 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
13b30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42   ){.      if( pB
13b40 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
13b50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13b60 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
13b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13b90 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
13ba0 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
13bb0 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
13bc0 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
13bd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13be0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13bf0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
13c00 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
13c10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13c20 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
13c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13c40 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
13c50 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
13c60 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d   }.  }while( rc=
13c70 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
13c80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
13c90 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
13ca0 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
13cb0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
13cc0 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
13cd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13ce0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
13cf0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
13d00 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
13d10 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
13d20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13d30 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
13d40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
13d50 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73 65 72  arable ){..asser
13d60 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
13d70 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
13d80 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
13d90 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
13da0 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
13db0 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
13dc0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
13dd0 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
13de0 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
13df0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
13e00 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
13e10 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
13e20 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
13e30 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
13e40 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
13e50 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
13e60 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
13e70 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
13e80 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
13e90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13ea0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
13eb0 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
13ec0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13ed0 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
13ee0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
13ef0 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
13f00 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
13f10 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31   = (u8)(wrflag>1
13f20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
13f30 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
13f40 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
13f50 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
13f60 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
13f70 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
13f80 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
13f90 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
13fa0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
13fb0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
13fc0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
13fd0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
13fe0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
13ff0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
14000 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
14010 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
14020 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
14030 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
14040 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14050 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
14060 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
14070 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
14080 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
14090 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
140a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
140b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
140c0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
140d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
140e0 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
140f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
14100 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
14110 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
14120 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
14130 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
14140 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
14150 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
14160 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
14170 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
14180 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
14190 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
141a0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
141b0 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
141c0 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
141d0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
14200 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
14210 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14230 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14240 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
14250 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
14260 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14280 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
14290 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
142a0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
142b0 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
142c0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
142d0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
142e0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
142f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14300 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
14310 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14320 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
14330 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
14340 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14350 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
14360 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
14370 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
14380 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
14390 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
143a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
143b0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
143c0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
143d0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
143e0 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
143f0 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
14400 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14410 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63        goto set_c
14420 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
14430 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
14440 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
14450 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
14460 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
14470 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72  (pCell);.      r
14480 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
14490 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
144a0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
144b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
144c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
144d0 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
144e0 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  aps_out;.    }. 
144f0 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
14500 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
14510 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
14520 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
14530 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
14540 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
14550 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
14560 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
14570 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
14580 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  o);.  }..set_chi
14590 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
145a0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
145b0 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
145c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
145d0 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
145e0 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
145f0 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
14600 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
14610 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
14620 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
14630 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
14640 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
14650 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
14660 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
14670 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
14680 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
14690 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
146a0 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
146b0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
146c0 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
146d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
146e0 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
146f0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
14700 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
14710 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
14720 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
14730 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
14740 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
14750 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
14760 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
14770 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
14780 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
14790 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
147a0 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
147b0 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
147c0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
147d0 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
14800 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
14810 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
14820 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
14830 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
14840 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
14850 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
14860 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14870 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
14880 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14890 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
148a0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
148b0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
148c0 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
148d0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
148e0 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
148f0 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
14900 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
14910 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
14920 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
14930 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
14940 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
14950 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
14960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14970 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
14980 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
14990 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
149a0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
149b0 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
149c0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
149d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
149e0 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62  nt nCell;..    b
149f0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
14a00 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ge);.    nCell =
14a10 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
14a20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14a30 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
14a40 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
14a50 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
14a60 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
14a70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
14a80 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
14a90 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
14aa0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
14ab0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
14ac0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
14ad0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
14ae0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
14af0 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
14b00 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
14b10 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
14b20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14b30 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
14b40 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
14b50 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
14b60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
14b80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14b90 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
14ba0 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
14bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
14bc0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
14bd0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
14be0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
14bf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
14c00 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
14c10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
14c20 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
14c30 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
14c40 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
14c50 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
14c60 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
14c70 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
14c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14c90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
14ca0 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
14cb0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
14cc0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
14cd0 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
14ce0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
14cf0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
14d00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
14d10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
14d20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
14d30 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
14d40 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
14d50 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
14d60 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
14d70 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
14d80 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
14d90 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  valid..*/.static
14da0 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
14db0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
14dc0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
14dd0 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
14de0 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
14df0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
14e00 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
14e10 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
14e20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
14e30 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
14e40 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
14e50 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
14e60 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
14e70 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
14e80 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
14e90 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
14ea0 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
14eb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
14ec0 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
14ed0 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
14ee0 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20  nt isCommit.){. 
14ef0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
14f00 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
14f10 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
14f20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
14f30 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
14f40 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
14f50 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
14f60 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
14f70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
14f80 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
14f90 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
14fa0 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
14fb0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
14fc0 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
14fd0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
14fe0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
14ff0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
15000 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15010 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
15020 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
15030 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
15040 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
15050 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
15060 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
15070 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
15080 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
15090 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
150a0 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
150b0 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
150c0 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
150d0 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
150e0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
150f0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
15100 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
15110 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
15120 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
15130 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
15140 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
15150 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
15160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
15180 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
15190 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
151a0 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
151b0 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
151c0 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
151d0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
151e0 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
151f0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
15200 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
15210 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
15220 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
15230 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
15240 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
15250 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
15260 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
15270 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
15280 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
15290 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
152a0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
152b0 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
152c0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
152d0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
152e0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
152f0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
15300 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
15310 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
15320 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
15330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
15340 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
15350 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
15360 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
15370 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
15380 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
15390 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
153a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
153b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
153c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
153d0 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
153e0 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
153f0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
15400 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
15410 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
15420 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
15430 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
15440 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a  W2, iFreePage);.
15450 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15470 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15480 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15490 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
154a0 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
154b0 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
154c0 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
154d0 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
154e0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
154f0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
15500 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
15510 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
15520 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
15530 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
15540 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
15550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
15560 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
15570 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
15580 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
15590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
155a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
155b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
155c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
155d0 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
155e0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
155f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15600 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
15610 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
15620 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15630 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
15640 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
15650 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
15660 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
15670 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
15680 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
15690 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
156a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
156b0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
156c0 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
156d0 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a  ype, iPtrPage);.
156e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
156f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
15700 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
15710 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
15720 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
15730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
15740 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
15750 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
15760 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
15770 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
15780 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
15790 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
157a0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
157b0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
157c0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
157d0 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
157e0 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
157f0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
15800 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c  .** point in cal
15810 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
15820 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
15830 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  n SQLITE_DONE..*
15840 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
15850 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  icly, this funct
15860 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
15870 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
15880 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20  .** database so 
15890 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
158a0 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
158b0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a  urrently in use.
158c0 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
158d0 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  in use..**.** If
158e0 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65   the nFin parame
158f0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
15900 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
15910 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
15920 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
15930 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
15940 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
15950 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
15960 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
15970 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
15980 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
15990 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
159a0 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
159b0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
159c0 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
159d0 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
159e0 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61  complete..*/.sta
159f0 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
15a00 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
15a10 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
15a20 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a   Pgno iLastPg){.
15a30 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
15a40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
15a50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
15a60 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
15a70 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
15a80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15a90 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
15aa0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
15ab0 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
15ac0 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
15ad0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
15ae0 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
15af0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
15b00 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e  E(pBt) ){.    in
15b10 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79  t rc;.    u8 eTy
15b20 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
15b30 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
15b40 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
15b50 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
15b60 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
15b70 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
15b80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15b90 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
15ba0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
15bb0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
15bc0 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
15bd0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
15be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15bf0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
15c00 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
15c10 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
15c20 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
15c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
15c40 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
15c50 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
15c60 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
15c70 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
15c80 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
15c90 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
15ca0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
15cb0 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
15cc0 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
15cd0 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
15ce0 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
15cf0 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
15d00 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
15d10 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
15d20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
15d30 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
15d40 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
15d50 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
15d60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
15d70 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
15d80 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
15d90 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
15da0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15db0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
15dc0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
15dd0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
15de0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
15df0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
15e00 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
15e10 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
15e20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
15e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15e50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15e60 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
15e70 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
15e80 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
15e90 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
15ea0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
15eb0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
15ec0 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
15ed0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
15ee0 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
15ef0 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
15f00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
15f10 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
15f20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
15f30 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
15f40 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
15f50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15f60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
15f70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
15f80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
15f90 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
15fa0 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
15fb0 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
15fc0 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
15fd0 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
15fe0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
15ff0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
16000 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
16010 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16020 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
16030 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
16040 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
16050 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
16060 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
16070 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
16080 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
16090 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
160a0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
160b0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
160c0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
160d0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
160e0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
160f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
16100 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
16110 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
16120 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
16130 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16150 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
16160 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
16170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16180 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16190 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
161a0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
161b0 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
161c0 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
161d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
161e0 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
161f0 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
16200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16210 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
16220 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
16230 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
16250 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
16260 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
16270 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
16280 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29  FreePg, nFin!=0)
16290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
162a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
162b0 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
162c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
162d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
162e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
162f0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69  }.  }..  if( nFi
16300 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  n==0 ){.    iLas
16310 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  tPg--;.    while
16320 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
16330 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16340 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
16350 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
16360 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  {.      if( PTRM
16370 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
16380 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
16390 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b     MemPage *pPg;
163a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
163b0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
163c0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50  Bt, iLastPg, &pP
163d0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
163e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
163f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
16400 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
16410 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
16420 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
16430 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
16440 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
16450 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
16460 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
164a0 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
164b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
164c0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
164d0 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
164e0 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20   iLastPg);.  }. 
164f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16500 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
16510 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
16520 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
16530 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
16540 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
16550 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
16560 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
16570 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
16580 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
16590 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
165a0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
165b0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
165c0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
165d0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
165e0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
165f0 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
16600 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
16610 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
16620 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
16630 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
16640 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
16650 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
16660 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16670 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
16680 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
16690 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
166a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
166b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
166c0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
166d0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
166e0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
166f0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
16700 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
16710 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
16720 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
16730 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
16740 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
16750 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
16760 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
16770 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
16780 65 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72  ep(pBt, 0, pager
16790 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b  Pagecount(pBt));
167a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
167b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
167c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
167d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
167e0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
167f0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
16800 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
16810 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
16820 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
16830 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
16840 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
16850 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
16860 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
16870 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
16880 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16890 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
168a0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
168b0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
168c0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
168d0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
168e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
168f0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
16900 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
16910 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
16920 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
16930 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
16940 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
16950 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
16960 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
16970 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
16980 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
16990 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
169a0 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
169b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
169c0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
169d0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
169e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
169f0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
16a00 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
16a10 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
16a20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
16a30 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
16a40 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
16a50 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
16a60 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
16a70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
16a80 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
16a90 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
16aa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16ab0 72 20 6f 66 20 70 61 67 65 73 20 6e 6f 20 74 68  r of pages no th
16ac0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
16ad0 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
16ae0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16af0 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
16b00 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
16b10 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
16b20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
16b30 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
16b40 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e  d */.    int nEn
16b50 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  try;        /* N
16b60 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
16b70 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70   on one ptrmap p
16b80 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
16b90 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
16ba0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
16bb0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
16bc0 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 70 61  ..    nOrig = pa
16bd0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
16be0 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
16bf0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
16c00 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
16c10 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
16c20 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
16c30 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
16c40 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
16c50 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
16c60 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
16c70 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
16c80 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
16c90 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
16ca0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
16cb0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
16cc0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
16cd0 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
16ce0 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
16cf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
16d00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16d10 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
16d20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
16d30 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
16d40 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
16d50 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d     nEntry = pBt-
16d60 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
16d70 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
16d80 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
16d90 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
16da0 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74  ig)+nEntry)/nEnt
16db0 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e  ry;.    nFin = n
16dc0 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
16dd0 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20  Ptrmap;.    if( 
16de0 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
16df0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
16e00 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
16e10 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
16e20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
16e30 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54   }.    while( PT
16e40 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16e50 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
16e60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
16e70 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
16e80 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nFin--;.    }.  
16e90 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
16ea0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16eb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
16ec0 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
16ed0 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
16ee0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
16ef0 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
16f00 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
16f10 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
16f20 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20   iFree);.    }. 
16f30 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
16f40 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
16f50 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
16f60 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
16f70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16f80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16f90 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
16fa0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
16fb0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
16fc0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
16fd0 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
16fe0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
16ff0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
17000 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
17010 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
17020 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
17030 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20  Pager, nFin);.  
17040 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
17050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17060 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
17070 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
17080 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
17090 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
170a0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
170b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
170c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
170d0 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
170e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
170f0 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
17100 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
17110 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
17120 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
17130 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
17140 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
17150 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
17160 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
17170 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
17180 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
17190 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
171a0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
171b0 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
171c0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
171d0 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
171e0 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
171f0 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
17200 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
17210 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
17220 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
17230 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
17240 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
17250 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
17260 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17270 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
17280 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
17290 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
172a0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
172b0 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
172c0 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
172d0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
172e0 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
172f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
17300 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
17310 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
17320 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
17330 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
17340 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
17350 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
17360 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
17370 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
17380 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
17390 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
173a0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
173b0 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
173c0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
173d0 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
173e0 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
173f0 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
17400 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
17410 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
17420 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
17430 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
17440 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
17450 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
17460 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
17470 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
17480 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
17490 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
174a0 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
174b0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
174c0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
174d0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
174e0 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
174f0 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
17500 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
17510 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
17520 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17530 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
17540 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
17550 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
17560 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
17570 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17580 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
17590 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
175a0 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
175b0 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
175c0 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
175d0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
175e0 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
175f0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
17600 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
17610 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
17620 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
17630 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
17640 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
17650 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
17660 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
17670 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
17680 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
17690 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
176a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
176b0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
176c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
176d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
176e0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
176f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17700 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
17710 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17720 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17730 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
17740 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
17750 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
17760 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
17770 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
17780 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
177a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
177b0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
177c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
177d0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
177e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
177f0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
17800 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
17810 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
17820 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17830 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
17840 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17850 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
17860 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
17870 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
17880 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
17890 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
178a0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
178b0 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
178c0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
178d0 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
178e0 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
178f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
17900 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
17910 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  Cursor *pCsr;.  
17920 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
17930 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
17940 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63  ) );..  /* Searc
17950 68 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 68  h for a cursor h
17960 65 6c 64 20 6f 70 65 6e 20 62 79 20 74 68 69 73  eld open by this
17970 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63 74 69   b-tree connecti
17980 6f 6e 2e 20 49 66 20 6f 6e 65 20 65 78 69 73 74  on. If one exist
17990 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  s,.  ** then the
179a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
179b0 6c 20 62 65 20 64 6f 77 6e 67 72 61 64 65 64 20  l be downgraded 
179c0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
179d0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
179e0 69 6e 73 74 65 61 64 20 6f 66 20 61 63 74 75 61  instead of actua
179f0 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 2e 20 41  lly concluded. A
17a00 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
17a10 20 74 6f 20 43 6f 6d 6d 69 74 50 68 61 73 65 54   to CommitPhaseT
17a20 77 6f 28 29 20 0a 20 20 2a 2a 20 6f 72 20 52 6f  wo() .  ** or Ro
17a30 6c 6c 62 61 63 6b 28 29 20 77 69 6c 6c 20 66 69  llback() will fi
17a40 6e 69 73 68 20 74 68 65 20 74 72 61 6e 73 61 63  nish the transac
17a50 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
17a60 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
17a70 2f 0a 20 20 66 6f 72 28 70 43 73 72 3d 70 42 74  /.  for(pCsr=pBt
17a80 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 73 72 20  ->pCursor; pCsr 
17a90 26 26 20 70 43 73 72 2d 3e 70 42 74 72 65 65 21  && pCsr->pBtree!
17aa0 3d 70 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e 70  =p; pCsr=pCsr->p
17ab0 4e 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28  Next);.  assert(
17ac0 20 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 69   pCsr==0 || p->i
17ad0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
17ae0 45 20 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65  E );..  btreeCle
17af0 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
17b00 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b  );.  if( pCsr ){
17b10 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c  .    downgradeAl
17b20 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
17b30 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
17b40 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
17b50 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  S_READ;.  }else{
17b60 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68  .    /* If the h
17b70 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69  andle had any ki
17b80 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
17b90 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
17ba0 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72  t the .    ** tr
17bb0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
17bc0 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
17bd0 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
17be0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20  saction count . 
17bf0 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c     ** reaches 0,
17c00 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
17c10 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
17c20 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
17c30 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20  treeIfUnused(). 
17c40 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77     ** call below
17c50 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
17c60 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20   pager.  */.    
17c70 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
17c80 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
17c90 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
17ca0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
17cb0 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  s(p);.      pBt-
17cc0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
17cd0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42  .      if( 0==pB
17ce0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
17cf0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
17d00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
17d10 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
17d20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
17d30 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Set the curren
17d40 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
17d50 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
17d60 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  E and unlock the
17d70 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69   .    ** pager i
17d80 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
17d90 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
17da0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
17db0 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70  ction.  */.    p
17dc0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
17dd0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f  S_NONE;.    unlo
17de0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
17df0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
17e00 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
17e10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
17e20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17e30 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
17e40 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
17e50 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
17e60 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
17e70 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
17e80 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
17e90 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
17ea0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
17eb0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
17ec0 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
17ed0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
17ee0 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
17ef0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
17f00 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
17f10 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
17f20 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
17f30 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
17f40 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
17f50 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
17f60 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
17f70 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
17f80 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
17f90 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
17fa0 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
17fb0 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
17fc0 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
17fd0 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
17fe0 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
17ff0 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
18000 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
18010 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
18020 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
18030 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
18040 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
18050 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ocks..**.** This
18060 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
18070 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
18080 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18090 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
180a0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
180b0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
180c0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
180d0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
180e0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
180f0 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
18100 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
18110 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
18120 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18130 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
18140 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
18150 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
18160 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
18170 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
18180 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
18190 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
181a0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
181b0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
181c0 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
181d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
181e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
181f0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
18200 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
18210 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
18220 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
18230 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
18240 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
18250 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
18260 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
18270 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
18280 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
18290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
182a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
182b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
182c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
182d0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72   }.    pBt->inTr
182e0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
182f0 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62  S_READ;.  }..  b
18300 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
18310 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
18320 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18340 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
18350 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
18360 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
18370 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
18380 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
18390 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
183a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
183b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
183c0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
183d0 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
183e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
183f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
18400 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
18410 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  wo(p);.  }.  sql
18420 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18430 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18440 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
18450 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
18460 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69  he number of wri
18470 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  te-cursors open 
18480 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  on this handle. 
18490 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
184a0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
184b0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
184c0 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
184d0 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
184e0 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
184f0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
18500 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
18510 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d  outine, a write-
18520 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
18530 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
18540 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69  capable of writi
18550 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73  ng to the databs
18560 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  e.  That means t
18570 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a  he cursor was.**
18580 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e   originally open
18590 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ed for writing a
185a0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  nd the cursor ha
185b0 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65  s not be disable
185c0 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69  d.** by having i
185d0 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64  ts state changed
185e0 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
185f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18600 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
18610 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  s(BtShared *pBt)
18620 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
18630 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
18640 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
18650 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
18660 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
18670 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
18680 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d  >wrFlag && pCur-
18690 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
186a0 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20  FAULT ) r++; .  
186b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
186c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
186d0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
186e0 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
186f0 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
18700 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
18710 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
18720 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42  very cursor on B
18730 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74  tShared that pBt
18740 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ree.** reference
18750 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  s..**.** Every c
18760 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64  ursor is tripped
18770 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
18780 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a  ors that belong.
18790 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ** to other data
187a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
187b0 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
187c0 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68  be sharing.** th
187d0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
187e0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
187f0 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
18800 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
18810 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41  ack occurs..** A
18820 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67  ll cursors using
18830 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20   the same cache 
18840 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a  must be tripped.
18850 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ** to prevent th
18860 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  em from trying t
18870 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20  o use the btree 
18880 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c  after.** the rol
18890 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c  lback.  The roll
188a0 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
188b0 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20  leted tables.** 
188c0 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61  or moved root pa
188d0 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f  ges, so it is no
188e0 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a  t sufficient to.
188f0 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74  ** save the stat
18900 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
18910 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
18920 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61  t be.** invalida
18930 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
18940 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
18950 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
18960 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
18970 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  de){.  BtCursor 
18980 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  *p;.  sqlite3Btr
18990 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
189a0 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
189b0 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
189c0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
189d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71     int i;.    sq
189e0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
189f0 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d  ursor(p);.    p-
18a00 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
18a10 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73  _FAULT;.    p->s
18a20 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  kip = errCode;. 
18a30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
18a40 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
18a50 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18a60 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
18a70 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b        p->apPage[
18a80 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
18a90 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
18aa0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d  Leave(pBtree);.}
18ab0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
18ac0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18ad0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41   in progress.  A
18ae0 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
18af0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20  be.** invalided 
18b00 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
18b10 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  n.  Any attempt 
18b20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a  to use a cursor.
18b30 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  ** that was open
18b40 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
18b50 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
18b60 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a  ion will result.
18b70 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  ** in an error..
18b80 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
18b90 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
18ba0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
18bb0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
18bc0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
18bd0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
18be0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
18bf0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
18c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18c10 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
18c20 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
18c30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
18c40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
18c50 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a  mPage *pPage1;..
18c60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18c70 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
18c80 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
18c90 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65  t, 0, 0);.#ifnde
18ca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
18cb0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
18cc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18cd0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
18ce0 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75   a horrible situ
18cf0 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20  ation. An IO or 
18d00 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
18d10 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20  ccurred whilst. 
18d20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20     ** trying to 
18d30 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69  save cursor posi
18d40 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69  tions. If this i
18d50 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72  s an automatic r
18d60 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20  ollback (as.    
18d70 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
18d80 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d   a constraint, m
18d90 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20  alloc() failure 
18da0 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65  or IO error) the
18db0 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  n .    ** the ca
18dc0 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72  che may be inter
18dd0 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
18de0 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  nt (not contain 
18df0 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a  valid trees) so.
18e00 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74      ** we cannot
18e10 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74   simply return t
18e20 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20  he error to the 
18e30 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c  caller. Instead,
18e40 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61   abort .    ** a
18e50 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20  ll queries that 
18e60 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79  may be using any
18e70 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
18e80 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73  that failed to s
18e90 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ave..    */.    
18ea0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
18eb0 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63  AllCursors(p, rc
18ec0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
18ed0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
18ee0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
18ef0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
18f00 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
18f10 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
18f20 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
18f30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
18f40 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
18f50 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
18f60 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
18f70 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
18f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18f90 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
18fa0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
18fb0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
18fc0 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
18fd0 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
18fe0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
18ff0 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
19000 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
19010 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
19020 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
19030 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
19040 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
19050 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
19060 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
19070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19080 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
19090 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
190a0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
190b0 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
190c0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
190d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
190e0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
190f0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
19100 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
19110 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19120 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19130 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
19140 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
19150 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
19160 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
19170 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
19180 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
19190 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
191a0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
191b0 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
191c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
191d0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
191e0 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
191f0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
19200 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
19210 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
19220 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
19230 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
19240 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
19250 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
19260 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
19270 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
19280 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
19290 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
192a0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
192b0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
192c0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
192d0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
192e0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
192f0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
19300 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
19310 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
19320 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
19330 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
19340 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
19350 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
19360 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
19370 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
19380 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
19390 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
193a0 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
193b0 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
193c0 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
193d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
193e0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
193f0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
19400 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
19410 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
19420 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
19430 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
19440 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
19450 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
19460 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
19470 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
19480 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
19490 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
194a0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
194b0 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
194c0 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
194d0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
194e0 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
194f0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
19500 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
19510 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
19520 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
19530 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
19540 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
19550 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
19560 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19570 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
19580 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
19590 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
195a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
195b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72    assert( pBt->r
195c0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
195d0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
195e0 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
195f0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
19600 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
19610 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  ;.  if( NEVER(p-
19620 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
19630 57 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65  WRITE || pBt->re
19640 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72  adOnly) ){.    r
19650 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
19660 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NAL;.  }else{.  
19670 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
19680 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
19690 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
196a0 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
196b0 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
196c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
196d0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
196e0 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  ith.    ** an in
196f0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
19700 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
19710 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
19720 6c 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ly using.    ** 
19730 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
19740 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
19750 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   open, release o
19760 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20  r rollback any. 
19770 20 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70     ** such savep
19780 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
19790 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
197a0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
197b0 69 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a  is active..    *
197c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
197d0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
197e0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
197f0 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
19800 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
19810 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19820 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19830 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
19840 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
19850 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
19860 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
19870 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
19880 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
19890 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
198a0 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
198b0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
198c0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
198d0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
198e0 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
198f0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
19900 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
19910 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
19920 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
19930 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
19940 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
19950 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
19960 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
19970 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
19980 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
19990 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
199a0 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
199b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
199c0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
199d0 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
199e0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
199f0 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
19a00 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
19a10 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
19a20 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
19a30 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
19a40 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
19a50 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
19a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
19a70 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
19a80 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
19a90 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
19aa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19ab0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
19ac0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
19ad0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
19ae0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
19af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
19b00 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
19b10 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
19b20 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
19b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
19b40 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
19b50 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
19b60 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
19b70 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
19b80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19b90 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
19ba0 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
19bb0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
19bc0 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
19bd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
19be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19bf0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
19c00 73 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  se(pBt);.    }. 
19c10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
19c20 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
19c30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19c40 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
19c50 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
19c60 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
19c70 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
19c80 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
19c90 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
19ca0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
19cb0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
19cc0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
19cd0 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
19ce0 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
19cf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
19d00 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
19d10 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
19d20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
19d30 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
19d40 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
19d50 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
19d60 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
19d70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
19d80 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
19d90 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
19da0 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
19db0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
19dc0 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
19dd0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
19de0 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
19df0 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
19e00 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
19e10 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
19e20 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
19e30 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
19e40 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
19e50 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
19e60 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
19e70 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
19e80 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
19e90 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
19ea0 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
19eb0 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
19ec0 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
19ed0 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
19ee0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
19ef0 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
19f00 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
19f10 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
19f20 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
19f30 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
19f40 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
19f50 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
19f60 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
19f70 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
19f80 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
19f90 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
19fa0 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
19fb0 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
19fc0 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
19fd0 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
19fe0 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
19ff0 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
1a000 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1a010 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
1a020 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
1a030 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
1a040 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
1a050 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
1a060 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
1a070 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1a080 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
1a090 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
1a0a0 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
1a0b0 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
1a0c0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
1a0d0 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
1a0e0 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
1a0f0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
1a100 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
1a110 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1a120 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
1a130 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
1a140 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1a150 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20  Size() bytes of 
1a160 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74  memory .** point
1a170 65 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61  ed to by pCur ha
1a180 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  ve been zeroed b
1a190 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  y the caller..*/
1a1a0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
1a1b0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1a1c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1a1f0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1a220 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1a230 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1a240 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a260 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1a270 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1a280 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1a290 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a2b0 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
1a2c0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1a2d0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1a2e0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a300 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
1a310 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
1a320 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1a330 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
1a340 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
1a350 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20  ree handle */.. 
1a360 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a370 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1a380 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
1a390 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
1a3a0 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  lag==1 );..  /* 
1a3b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
1a3c0 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
1a3d0 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
1a3e0 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
1a3f0 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
1a400 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
1a410 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
1a420 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
1a430 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
1a440 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
1a450 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1a460 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
1a470 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
1a480 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
1a490 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
1a4a0 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
1a4b0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1a4c0 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
1a4d0 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29  fo!=0, wrFlag+1)
1a4e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1a4f0 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
1a500 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
1a510 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
1a520 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
1a530 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
1a540 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
1a550 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
1a560 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1a570 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1a580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1a590 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
1a5a0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1a5b0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1a5c0 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
1a5d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1a5e0 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
1a5f0 28 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrFlag && pBt->
1a600 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
1a610 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
1a620 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
1a630 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
1a640 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1a650 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Bt)==0 ){.    re
1a660 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54  turn SQLITE_EMPT
1a670 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  Y;.  }..  /* Now
1a680 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
1a690 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
1a6a0 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
1a6b0 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
1a6c0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61    ** variables a
1a6d0 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  nd link the curs
1a6e0 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
1a6f0 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ared list.  */. 
1a700 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
1a710 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
1a720 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
1a730 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  -1;.  pCur->pKey
1a740 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
1a750 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
1a760 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
1a770 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
1a780 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46  wrFlag = (u8)wrF
1a790 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
1a7a0 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
1a7b0 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
1a7c0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
1a7d0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1a7e0 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
1a7f0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1a800 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
1a810 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1a820 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65  D;.  pCur->cache
1a830 64 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65  dRowid = 0;.  re
1a840 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a850 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1a860 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
1a870 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1a8a0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1a8b0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1a8e0 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1a8f0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1a900 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a920 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1a930 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1a940 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1a950 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1a980 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
1a990 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a9c0 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
1a9d0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1a9e0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1a9f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1aa00 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
1aa10 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
1aa20 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1aa30 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
1aa40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1aa50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1aa60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
1aa70 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
1aa80 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
1aa90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
1aaa0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
1aab0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
1aac0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
1aad0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
1aae0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
1aaf0 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
1ab00 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
1ab10 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
1ab20 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
1ab30 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
1ab40 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
1ab50 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
1ab60 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
1ab70 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
1ab80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1ab90 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
1aba0 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42   return sizeof(B
1abb0 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a  tCursor);.}../*.
1abc0 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65  ** Set the cache
1abd0 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66  d rowid value of
1abe0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e   every cursor in
1abf0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
1ac00 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43  se file.** as pC
1ac10 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68  ur and having th
1ac20 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1ac30 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e   number as pCur.
1ac40 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a    The value is.*
1ac50 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e  * set to iRowid.
1ac60 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69  .**.** Only posi
1ac70 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65  tive rowid value
1ac80 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1ac90 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20   valid for this 
1aca0 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61  cache..** The ca
1acb0 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  che is initializ
1acc0 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69  ed to zero, indi
1acd0 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69  cating an invali
1ace0 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74  d cache..** A bt
1acf0 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  ree will work fi
1ad00 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20  ne with zero or 
1ad10 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e  negative rowids.
1ad20 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74    We just cannot
1ad30 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f  .** cache zero o
1ad40 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1ad50 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  s, which means t
1ad60 61 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a  ables that use z
1ad70 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69  ero or.** negati
1ad80 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20  ve rowids might 
1ad90 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
1ada0 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61  wer.  But in pra
1adb0 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ctice, zero.** o
1adc0 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1add0 73 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d  s are very uncom
1ade0 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75  mon so this shou
1adf0 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62  ld not be a prob
1ae00 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lem..*/.void sql
1ae10 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
1ae20 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
1ae30 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f   *pCur, sqlite3_
1ae40 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  int64 iRowid){. 
1ae50 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1ae60 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d  for(p=pCur->pBt-
1ae70 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1ae80 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1ae90 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70  ( p->pgnoRoot==p
1aea0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20  Cur->pgnoRoot ) 
1aeb0 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  p->cachedRowid =
1aec0 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61   iRowid;.  }.  a
1aed0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63  ssert( pCur->cac
1aee0 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64  hedRowid==iRowid
1aef0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
1af00 75 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72  urn the cached r
1af10 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76  owid for the giv
1af20 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65  en cursor.  A ne
1af30 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a  gative or zero.*
1af40 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1af50 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1af60 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73  e rowid cache is
1af70 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
1af80 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65  uld be.** ignore
1af90 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64  d.  If the rowid
1afa0 20 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72   cache has never
1afb0 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74   before been set
1afc0 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f  , then a.** zero
1afd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1afe0 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1aff0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61  qlite3BtreeGetCa
1b000 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
1b010 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
1b020 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64  urn pCur->cached
1b030 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1b040 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
1b050 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
1b060 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1b070 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
1b080 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
1b090 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
1b0a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1b0b0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
1b0c0 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
1b0d0 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
1b0e0 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
1b0f0 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
1b100 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1b110 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b120 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20  = pCur->pBt;.   
1b130 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b140 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1b150 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1b160 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
1b170 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72     if( pCur->pPr
1b180 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ev ){.      pCur
1b190 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
1b1a0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
1b1b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b1c0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
1b1d0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
1b1e0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1b1f0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43  Next ){.      pC
1b200 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
1b210 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a   = pCur->pPrev;.
1b220 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
1b230 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
1b240 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
1b250 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
1b260 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1b270 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
1b280 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1b290 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
1b2a0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
1b2b0 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  r);.    /* sqlit
1b2c0 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
1b2d0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
1b2e0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
1b2f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1b300 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b310 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1b320 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
1b330 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1b340 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
1b350 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
1b360 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
1b370 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
1b380 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
1b390 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
1b3a0 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
1b3b0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1b3c0 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
1b3d0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
1b3e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
1b3f0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
1b400 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
1b410 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
1b420 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
1b430 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32  eCell()..**.** 2
1b440 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72  007-06-25:  Ther
1b450 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f  e is a bug in so
1b460 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d  me versions of M
1b470 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74  SVC that cause t
1b480 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74  he.** compiler t
1b490 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74  o crash when get
1b4a0 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d  CellInfo() is im
1b4b0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d  plemented as a m
1b4c0 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65  acro..** But the
1b4d0 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61  re is a measurea
1b4e0 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74  ble speed advant
1b4f0 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65  age to using the
1b500 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a   macro on gcc.**
1b510 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70   (when less comp
1b520 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  iler optimizatio
1b530 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d  ns like -Os or -
1b540 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20  O0 are used and 
1b550 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
1b560 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72  is not doing agr
1b570 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e  essive inlining.
1b580 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72  )  So we use a r
1b590 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eal function.** 
1b5a0 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d  for MSVC and a m
1b5b0 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68  acro for everyth
1b5c0 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65  ing else.  Ticke
1b5d0 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e  t #2457..*/.#ifn
1b5e0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
1b5f0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
1b600 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
1b610 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
1b620 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
1b630 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1b640 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
1b650 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
1b660 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
1b670 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1b680 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1b690 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
1b6a0 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
1b6b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
1b6c0 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
1b6d0 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
1b6e0 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
1b6f0 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
1b700 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
1b710 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
1b720 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
1b730 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
1b740 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
1b750 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
1b760 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
1b770 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
1b780 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
1b790 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1b7a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1b7b0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
1b7c0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1b7d0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1b7e0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1b7f0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1b800 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1b810 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1b820 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
1b830 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1b840 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b850 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1b860 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
1b870 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
1b880 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
1b890 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
1b8a0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
1b8b0 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
1b8c0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
1b8d0 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
1b8e0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1b8f0 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
1b930 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b940 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69           \.    i
1b980 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1b990 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >iPage;         
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1b9d0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1b9e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1b9f0 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1ba00 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1ba10 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e  o); \.    pCur->
1ba20 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba60 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
1bac0 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
1bad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
1bb10 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
1bb20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
1bb30 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
1bb40 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
1bb50 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
1bb60 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
1bb70 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
1bb80 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
1bb90 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1bba0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
1bbb0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
1bbc0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1bbd0 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
1bbe0 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
1bbf0 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
1bc00 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1bc10 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
1bc20 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
1bc30 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1bc40 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
1bc50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bc60 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
1bc70 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
1bc80 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1bc90 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1bca0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1bcb0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1bcc0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
1bcd0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1bce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bcf0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1bd00 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1bd10 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
1bd20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1bd30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
1bd40 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1bd50 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1bd60 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
1bd70 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1bd80 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
1bd90 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
1bda0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1bdb0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  o.nKey;.    }.  
1bdc0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1bdd0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1bde0 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
1bdf0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
1be00 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
1be10 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
1be20 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1be30 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
1be40 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
1be50 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1be60 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20  ssible.  If the 
1be70 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75  cursor is not cu
1be80 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
1be90 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  ing to an entry 
1bea0 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65  (which can happe
1beb0 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
1bec0 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  if.** the databa
1bed0 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65  se is empty) the
1bee0 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  n *pSize is set 
1bef0 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
1bf00 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1bf10 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1bf20 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1bf30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1bf40 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1bf50 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1bf60 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1bf70 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1bf80 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1bf90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1bfa0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1bfb0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1bfc0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1bfd0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1bfe0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1bff0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c000 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
1c010 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
1c020 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
1c030 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
1c040 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
1c050 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
1c060 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
1c070 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1c080 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
1c090 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
1c0a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c0b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
1c0c0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
1c0d0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
1c0e0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1c0f0 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
1c100 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
1c110 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
1c120 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1c130 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
1c140 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
1c150 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
1c160 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
1c170 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
1c180 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
1c190 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
1c1a0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
1c1b0 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
1c1c0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
1c1d0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
1c1e0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1c1f0 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
1c200 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1c210 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1c220 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
1c230 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1c240 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
1c250 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
1c260 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
1c270 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
1c280 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
1c290 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1c2a0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1c2b0 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1c2c0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1c2d0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1c2e0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1c2f0 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1c300 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1c310 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1c320 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1c330 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
1c340 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
1c350 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
1c360 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1c370 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
1c380 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1c390 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1c3a0 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
1c3b0 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
1c3c0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
1c3d0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
1c3e0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
1c3f0 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
1c400 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
1c410 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
1c420 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
1c430 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
1c440 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
1c450 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1c460 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
1c470 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
1c480 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
1c490 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1c4a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1c4b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1c4c0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c4e0 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
1c4f0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
1c500 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1c510 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
1c520 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
1c530 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
1c540 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
1c550 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
1c560 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1c570 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1c580 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
1c590 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
1c5a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1c5b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1c5c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1c5d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1c5e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1c5f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1c600 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
1c610 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c620 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1c630 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
1c640 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1c650 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1c660 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
1c670 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
1c680 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
1c690 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
1c6a0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
1c6b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1c6c0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
1c6d0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
1c6e0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
1c6f0 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
1c700 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
1c710 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
1c720 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
1c730 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
1c740 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1c750 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
1c760 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1c770 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1c780 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
1c790 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
1c7a0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
1c7b0 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
1c7c0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1c7d0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
1c7e0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
1c7f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1c800 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
1c810 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
1c820 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50  ( iGuess<=pagerP
1c830 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
1c840 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1c850 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
1c860 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
1c870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c880 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
1c890 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1c8a0 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
1c8b0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
1c8c0 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
1c8d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c8e0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
1c8f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1c900 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
1c910 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
1c920 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
1c930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c940 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1c950 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
1c960 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
1c970 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1c980 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1c990 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
1c9a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c9b0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
1c9c0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1c9d0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1c9e0 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
1c9f0 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
1ca00 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
1ca10 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
1ca20 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
1ca30 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
1ca40 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
1ca50 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
1ca60 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
1ca70 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
1ca80 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
1ca90 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
1caa0 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
1cab0 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
1cac0 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
1cad0 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
1cae0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1caf0 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
1cb00 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
1cb10 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
1cb20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
1cb30 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
1cb40 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
1cb50 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
1cb60 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
1cb70 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
1cb80 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
1cb90 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1cba0 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
1cbb0 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
1cbc0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1cbd0 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
1cbe0 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
1cbf0 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
1cc00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1cc10 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
1cc20 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
1cc30 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
1cc40 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
1cc50 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
1cc60 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
1cc70 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
1cc80 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
1cc90 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
1cca0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1ccb0 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
1ccc0 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
1ccd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1cce0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
1ccf0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
1cd00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cd10 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
1cd20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
1cd30 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
1cd40 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1cd50 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
1cd60 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
1cd70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
1cd80 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
1cd90 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1cda0 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
1cdb0 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
1cdc0 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
1cdd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cde0 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
1cdf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ce00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ce10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ce20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
1ce30 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
1ce40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ce50 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
1ce60 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
1ce70 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
1ce80 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
1ce90 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
1cea0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
1ceb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ced0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1cee0 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
1cef0 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
1cf00 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
1cf10 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1cf20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
1cf30 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
1cf40 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
1cf50 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
1cf60 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
1cf70 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
1cf80 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
1cf90 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
1cfa0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
1cfb0 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
1cfc0 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
1cfd0 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
1cfe0 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
1cff0 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
1d000 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
1d010 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
1d020 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
1d030 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
1d040 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
1d050 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  * The content be
1d060 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74  ing read or writ
1d070 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72  ten might appear
1d080 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
1d090 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74  e.** or be scatt
1d0a0 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1d0b0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
1d0c0 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
1d0d0 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
1d0e0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
1d0f0 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
1d100 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
1d110 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
1d120 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
1d130 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
1d140 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
1d150 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
1d160 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
1d170 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
1d180 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
1d190 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
1d1a0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
1d1b0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1d1c0 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
1d1d0 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
1d1e0 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
1d1f0 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
1d200 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
1d210 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
1d220 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1d230 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1d240 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
1d250 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
1d260 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
1d270 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
1d280 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
1d290 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
1d2a0 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
1d2b0 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
1d2c0 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
1d2d0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
1d2e0 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
1d2f0 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
1d300 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
1d310 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1d320 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
1d330 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
1d340 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
1d350 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
1d360 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
1d370 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
1d380 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
1d390 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
1d3a0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
1d3b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d3c0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
1d3d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
1d3e0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1d3f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
1d400 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
1d410 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
1d420 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
1d430 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
1d440 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
1d450 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
1d460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
1d470 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
1d480 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
1d490 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
1d4a0 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
1d4b0 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
1d4c0 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
1d4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
1d4e0 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
1d4f0 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
1d500 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
1d510 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
1d520 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d530 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79  E_OK;.  u32 nKey
1d540 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
1d550 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1d560 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1d570 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  e[pCur->iPage]; 
1d580 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
1d590 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
1d5a0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1d5b0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
1d5e0 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
1d5f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1d600 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1d610 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1d620 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1d630 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1d640 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1d650 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1d660 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1d670 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d680 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
1d690 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
1d6a0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
1d6b0 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72  nfo.pCell + pCur
1d6c0 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1d6d0 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d    nKey = (pPage-
1d6e0 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69  >intKey ? 0 : (i
1d6f0 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
1d700 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ey);..  if( NEVE
1d710 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  R(offset+amt > n
1d720 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
1d730 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50  Data) .   || &aP
1d740 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1d750 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
1d760 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
1d770 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a  sableSize].  ){.
1d780 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
1d790 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
1d7a0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1d7b0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
1d7c0 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
1d7d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1d7e0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1d7f0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
1d800 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
1d810 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
1d820 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
1d830 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
1d840 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
1d850 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
1d860 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
1d870 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
1d880 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1d890 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
1d8a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
1d8b0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
1d8c0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
1d8d0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
1d8e0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1d8f0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
1d900 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
1d910 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
1d920 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
1d930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
1d940 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
1d950 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
1d960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d970 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1d980 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
1d990 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
1d9a0 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
1d9b0 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
1d9c0 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
1d9d0 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
1d9e0 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
1d9f0 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
1da00 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1da10 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
1da20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1da30 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
1da40 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
1da50 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1da60 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
1da70 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
1da80 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
1da90 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
1daa0 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
1dab0 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
1dac0 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
1dad0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
1dae0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1daf0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1db00 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
1db10 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1db20 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1db30 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
1db40 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
1db50 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
1db60 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
1db70 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
1db80 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
1db90 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
1dba0 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
1dbb0 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
1dbc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1dbd0 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
1dbe0 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
1dbf0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1dc00 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
1dc10 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
1dc20 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
1dc30 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
1dc40 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
1dc50 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1dc60 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
1dc70 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1dc80 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
1dc90 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f  fl);.      /* nO
1dca0 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20 70 6f  vfl is always po
1dcb0 73 69 74 69 76 65 2e 20 20 49 66 20 69 74 20 77  sitive.  If it w
1dcc0 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63 68 50  ere zero, fetchP
1dcd0 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61 76  ayload would hav
1dce0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20  e.      ** been 
1dcf0 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
1dd00 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f  this routine. */
1dd10 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
1dd20 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70 43 75  S(nOvfl) && !pCu
1dd30 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1dd40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1dd50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1dd60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1dd70 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
1dd80 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1dd90 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1dda0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
1ddb0 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1ddc0 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
1ddd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1dde0 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
1ddf0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
1de00 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
1de10 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1de20 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1de30 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
1de40 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
1de50 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
1de60 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
1de70 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1de80 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1de90 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
1dea0 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
1deb0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1dec0 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
1ded0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1dee0 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
1def0 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
1df00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1df10 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
1df20 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
1df30 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
1df40 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1df50 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
1df60 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1df70 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
1df80 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
1df90 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
1dfa0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1dfb0 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
1dfc0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
1dfd0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
1dfe0 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
1dff0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
1e000 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
1e010 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1e020 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
1e030 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
1e040 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
1e050 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
1e060 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
1e070 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1e080 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
1e090 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
1e0a0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
1e0b0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
1e0c0 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
1e0d0 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
1e0e0 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
1e0f0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
1e100 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
1e110 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
1e120 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
1e130 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
1e140 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
1e150 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e160 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1e170 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
1e180 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1e190 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1e1a0 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
1e1b0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
1e1c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1e1d0 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
1e1e0 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
1e1f0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
1e200 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
1e210 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
1e220 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1e230 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
1e240 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
1e250 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
1e260 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
1e270 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
1e280 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
1e290 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1e2a0 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
1e2b0 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
1e2c0 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
1e2d0 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
1e2e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e2f0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
1e300 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
1e310 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
1e320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e330 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
1e340 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
1e350 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e370 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
1e380 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
1e390 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
1e3a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e3b0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1e3c0 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
1e3d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
1e3e0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
1e3f0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1e400 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
1e410 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1e420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e430 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
1e440 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
1e450 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
1e460 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
1e470 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e480 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
1e490 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
1e4a0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
1e4b0 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
1e4c0 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
1e4d0 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
1e4e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e4f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e500 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1e510 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e520 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1e530 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1e550 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
1e560 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e570 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
1e580 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
1e590 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
1e5a0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
1e5b0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
1e5c0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
1e5d0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
1e5e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1e5f0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
1e600 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1e610 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1e620 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
1e630 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
1e640 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
1e650 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
1e660 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
1e670 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
1e680 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
1e690 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1e6a0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1e6b0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1e6c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1e6d0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e6e0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e6f0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1e700 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1e710 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1e720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1e730 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e740 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e750 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e760 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1e770 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1e780 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1e790 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50     if( pCur->apP
1e7a0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
1e7b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e7c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e7d0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
1e7e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1e7f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1e800 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e810 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
1e820 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
1e830 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
1e840 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
1e850 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
1e860 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
1e870 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e880 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
1e890 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
1e8a0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
1e8b0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
1e8c0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
1e8d0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
1e8e0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
1e8f0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
1e900 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
1e910 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1e920 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1e930 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
1e940 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
1e950 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
1e960 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
1e970 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
1e980 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
1e990 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
1e9a0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
1e9b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e9c0 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
1e9d0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
1e9e0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
1e9f0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
1ea00 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1ea10 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1ea20 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
1ea30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1ea40 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1ea50 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
1ea60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1ea70 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1ea80 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1ea90 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1eaa0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1eab0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1eac0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1ead0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1eae0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1eaf0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
1eb00 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1eb10 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
1eb20 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1eb30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1eb40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1eb50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
1eb60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1eb70 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
1eb80 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
1eb90 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
1eba0 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
1ebb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ebc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1ebd0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
1ebe0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
1ebf0 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
1ec00 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
1ec10 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1ec20 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
1ec30 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
1ec40 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
1ec50 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
1ec60 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
1ec70 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1ec80 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
1ec90 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
1eca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ecb0 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
1ecc0 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
1ecd0 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
1ece0 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
1ecf0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
1ed00 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
1ed10 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
1ed20 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
1ed30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
1ed40 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
1ed50 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
1ed60 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
1ed70 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
1ed80 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
1ed90 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
1eda0 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
1edb0 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
1edc0 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
1edd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
1ede0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
1edf0 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
1ee00 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
1ee10 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
1ee20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
1ee30 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
1ee40 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
1ee50 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
1ee60 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
1ee70 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
1ee80 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
1ee90 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
1eea0 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
1eeb0 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
1eec0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
1eed0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
1eee0 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
1eef0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
1ef00 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
1ef10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1ef20 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
1ef30 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
1ef40 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
1ef50 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
1ef60 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
1ef70 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
1ef80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74  signed char *fet
1ef90 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
1efa0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1efb0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
1efc0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
1efd0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1efe0 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20  int *pAmt,      
1eff0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1f000 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
1f010 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
1f020 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65   */.  int skipKe
1f030 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  y          /* re
1f040 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ad beginning at 
1f050 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
1f060 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
1f070 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
1f080 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20  load;.  MemPage 
1f090 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b  *pPage;.  u32 nK
1f0a0 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c  ey;.  u32 nLocal
1f0b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
1f0c0 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
1f0d0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1f0e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1f0f0 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
1f100 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1f110 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1f120 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1f130 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1f140 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
1f150 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1f160 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
1f170 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1f180 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1f190 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
1f1a0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1f1b0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1f1c0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
1f1d0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
1f1e0 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1f1f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1f200 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
1f210 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1f220 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43    nKey = (int)pC
1f230 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1f240 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79   }.  if( skipKey
1f250 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64   ){.    aPayload
1f260 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c   += nKey;.    nL
1f270 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
1f280 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b  o.nLocal - nKey;
1f290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1f2a0 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
1f2b0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66  o.nLocal;.    if
1f2c0 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b  ( nLocal>nKey ){
1f2d0 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  .      nLocal = 
1f2e0 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
1f2f0 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c    *pAmt = nLocal
1f300 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c  ;.  return aPayl
1f310 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
1f320 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
1f330 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
1f340 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
1f350 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
1f360 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
1f370 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
1f380 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
1f390 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
1f3a0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
1f3b0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1f3c0 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
1f3d0 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
1f3e0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
1f3f0 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
1f400 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
1f410 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
1f420 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
1f430 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
1f440 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
1f450 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
1f460 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
1f470 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
1f480 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
1f490 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
1f4a0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
1f4b0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
1f4c0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
1f4d0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1f4e0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
1f4f0 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
1f500 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
1f510 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
1f520 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
1f530 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
1f540 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1f550 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
1f560 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
1f570 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
1f580 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1f590 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
1f5a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1f5b0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1f5c0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1f5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1f5e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f5f0 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
1f600 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f610 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
1f620 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
1f630 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1f640 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20  Cur, pAmt, 0);. 
1f650 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1f660 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
1f670 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
1f680 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
1f690 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
1f6a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f6b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1f6c0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1f6d0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1f6e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f6f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1f700 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f710 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1f720 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1f730 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1f740 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1f750 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1f760 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
1f770 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1f780 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
1f790 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
1f7a0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
1f7b0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
1f7c0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
1f7d0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
1f7e0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
1f7f0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
1f800 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
1f810 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
1f820 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
1f830 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
1f840 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
1f850 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
1f860 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
1f870 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
1f880 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
1f890 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
1f8a0 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
1f8b0 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
1f8c0 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
1f8d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1f8e0 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
1f8f0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
1f900 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
1f910 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
1f920 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
1f930 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1f940 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1f950 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
1f960 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1f970 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1f980 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f990 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f9a0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1f9b0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
1f9c0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
1f9d0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1f9e0 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
1f9f0 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
1fa00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1fa10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1fa20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
1fa30 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1fa40 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
1fa50 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1fa60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
1fa70 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
1fa80 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
1fa90 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
1faa0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
1fab0 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
1fac0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1fad0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1fae0 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
1faf0 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
1fb00 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
1fb10 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
1fb20 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1fb30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1fb40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1fb50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fb60 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  OK;.}..#ifndef N
1fb70 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
1fb80 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
1fb90 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
1fba0 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
1fbb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
1fbc0 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
1fbd0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
1fbe0 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
1fbf0 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
1fc00 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
1fc10 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
1fc20 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
1fc30 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
1fc40 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
1fc50 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
1fc60 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
1fc70 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
1fc80 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
1fc90 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
1fca0 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
1fcb0 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
1fcc0 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
1fcd0 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
1fce0 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
1fcf0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
1fd00 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
1fd10 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
1fd20 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
1fd30 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
1fd40 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
1fd50 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
1fd60 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
1fd70 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
1fd80 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1fd90 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
1fda0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
1fdb0 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
1fdc0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1fdd0 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
1fde0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1fdf0 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
1fe00 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
1fe10 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
1fe20 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
1fe30 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
1fe40 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
1fe50 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
1fe60 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
1fe70 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
1fe80 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
1fe90 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
1fea0 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
1feb0 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
1fec0 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
1fed0 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
1fee0 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ell index..*/.st
1fef0 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f  atic void moveTo
1ff00 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
1ff10 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
1ff20 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1ff30 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1ff40 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1ff50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ff60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ff70 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
1ff80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1ff90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1ffa0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
1ffb0 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
1ffc0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1ffd0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
1ffe0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1fff0 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
20000 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
20010 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
20020 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  o.  );.  release
20030 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
20040 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
20050 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
20060 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
20070 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
20080 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
20090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
200a0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
200b0 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
200c0 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
200d0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
200e0 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
200f0 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
20100 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
20110 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
20120 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
20130 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
20140 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
20150 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
20160 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
20170 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
20180 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
20190 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
201a0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
201b0 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
201c0 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
201d0 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
201e0 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
201f0 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
20200 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
20210 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
20220 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
20230 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
20240 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
20250 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
20260 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
20270 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
20280 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
20290 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
202a0 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
202b0 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
202c0 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
202d0 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
202e0 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
202f0 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
20300 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
20310 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
20320 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
20330 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
20340 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
20350 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
20360 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
20370 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
20380 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
20390 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
203a0 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
203b0 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
203c0 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
203d0 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
203e0 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
203f0 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
20400 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
20410 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
20420 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
20430 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
20440 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
20450 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
20460 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
20470 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
20480 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
20490 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
204a0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
204b0 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
204c0 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
204d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
204e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
204f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
20500 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
20510 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
20520 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
20530 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
20540 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20550 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20560 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
20570 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
20580 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
20590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
205a0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
205b0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
205c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
205d0 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
205e0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
205f0 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
20600 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
20610 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
20620 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
20630 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
20640 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
20650 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 53  t( pCur->skip!=S
20660 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
20670 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
20680 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  kip;.    }.    s
20690 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
206a0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
206b0 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
206c0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
206d0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
206e0 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  1; i<=pCur->iPag
206f0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
20700 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
20710 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
20720 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
20730 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ge = 0;.  }else{
20740 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20  .    if( .      
20750 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
20760 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
20770 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
20780 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
20790 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a 20  ge[0])).    ){. 
207a0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
207b0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
207c0 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
207d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
207e0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
207f0 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d  .    /* If pCur-
20800 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74  >pKeyInfo is not
20810 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
20820 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e  caller that open
20830 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20  ed this cursor. 
20840 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74     ** expected t
20850 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
20860 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
20870 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
20880 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e  Info is.    ** N
20890 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
208a0 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
208b0 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
208c0 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
208d0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  .    ** return a
208e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
208f0 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
20900 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
20910 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
20920 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =1 || pCur->apPa
20930 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30  ge[0]->intKey==0
20940 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75   );.    if( (pCu
20950 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
20960 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
20970 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
20980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20990 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
209a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73    }.  }..  /* As
209b0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 72 6f  sert that the ro
209c0 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20 74 68  ot page is of th
209d0 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20  e correct type. 
209e0 54 68 69 73 20 6d 75 73 74 20 62 65 20 74 68 65  This must be the
209f0 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68  .  ** case as th
20a00 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  e call to this f
20a10 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61  unction that loa
20a20 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  ded the root-pag
20a30 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74  e (either.  ** t
20a40 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72  his call or a pr
20a50 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f  evious invocatio
20a60 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  n) would have de
20a70 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
20a80 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61  n .  ** if the a
20a90 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e  ssumption were n
20aa0 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20  ot true, and it 
20ab0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
20ac0 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20  for the flags . 
20ad0 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65   ** byte to have
20ae0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77   been modified w
20af0 68 69 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72  hile this cursor
20b00 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
20b10 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20  ference.  ** to 
20b20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  the page.  */.  
20b30 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
20b40 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
20b50 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
20b60 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
20b70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
20b80 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43  t->isInit && (pC
20b90 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
20ba0 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  ==pRoot->intKey 
20bb0 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  );..  pCur->aiId
20bc0 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
20bd0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
20be0 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  ;.  pCur->atLast
20bf0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
20c00 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
20c10 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
20c20 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c  ==0 && !pRoot->l
20c30 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
20c40 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28  subpage;.    if(
20c50 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20   pRoot->pgno!=1 
20c60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20c70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20c80 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
20c90 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
20ca0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
20cb0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
20cc0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
20cd0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
20ce0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
20cf0 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
20d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
20d10 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f  ->eState = ((pRo
20d20 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52  ot->nCell>0)?CUR
20d30 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52  SOR_VALID:CURSOR
20d40 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20  _INVALID);.  }. 
20d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20d60 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
20d70 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
20d80 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
20d90 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
20da0 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
20db0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
20dc0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
20dd0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
20de0 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
20df0 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
20e00 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
20e10 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
20e20 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
20e30 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
20e40 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
20e50 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
20e60 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
20e70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
20e80 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
20e90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
20ea0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
20eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20ec0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
20ed0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
20ee0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
20ef0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
20f00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20f10 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
20f20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
20f30 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20f40 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
20f50 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
20f60 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
20f70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
20f80 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20f90 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d  age]));.    rc =
20fa0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
20fb0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
20fc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20fd0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
20fe0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
20ff0 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
21000 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
21010 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
21020 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
21030 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
21040 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
21050 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
21060 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
21070 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
21080 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
21090 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
210a0 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
210b0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
210c0 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
210d0 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
210e0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
210f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
21100 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
21110 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
21120 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
21130 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
21140 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
21150 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
21160 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
21170 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
21180 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
21190 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
211a0 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
211b0 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
211c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
211d0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
211e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
211f0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21210 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21220 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
21230 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
21240 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
21250 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21260 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
21270 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
21280 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
21290 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
212a0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
212b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
212c0 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
212d0 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
212e0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
212f0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
21300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21310 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  OK ){.    pCur->
21320 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21330 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
21340 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l-1;.    pCur->i
21350 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
21360 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
21370 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
21380 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
21390 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
213a0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
213b0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
213c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
213d0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
213e0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
213f0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
21400 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
21410 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
21420 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
21430 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
21440 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
21450 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
21460 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
21470 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
21480 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
21490 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
214a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
214b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
214c0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
214d0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
214e0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
214f0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
21500 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21510 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
21520 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21530 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
21540 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
21550 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21560 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
21570 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
21580 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  1;.      rc = SQ
21590 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
215a0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
215b0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
215c0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
215d0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
215e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
215f0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
21600 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
21610 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21620 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
21630 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
21640 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
21650 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
21660 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
21670 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
21680 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
21690 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
216a0 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
216b0 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
216c0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
216d0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
216e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
216f0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
21700 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
21710 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
21720 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21730 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
21750 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
21760 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
21770 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
21780 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
21790 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
217a0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
217b0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
217c0 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
217d0 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
217e0 65 53 74 61 74 65 20 26 26 20 70 43 75 72 2d 3e  eState && pCur->
217f0 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65 66  atLast ){.#ifdef
21800 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
21810 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
21820 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
21830 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
21840 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
21850 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
21860 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
21870 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
21880 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
21890 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
218a0 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
218b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
218c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
218d0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
218e0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
218f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
21900 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21910 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
21920 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21930 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
21940 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21950 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21960 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
21970 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
21980 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
21990 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
219a0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
219b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
219c0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
219d0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
219e0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
219f0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
21a00 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
21a10 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
21a20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
21a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
21a40 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21a50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21a60 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
21a70 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
21a80 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
21a90 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75  pCur);.      pCu
21aa0 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d  r->atLast = rc==
21ab0 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a  SQLITE_OK ?1:0;.
21ac0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21ad0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
21ae0 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
21af0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
21b00 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
21b10 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
21b20 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
21b30 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
21b40 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
21b50 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
21b60 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
21b70 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
21b80 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
21b90 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
21ba0 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
21bb0 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
21bc0 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
21bd0 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
21be0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
21bf0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
21c00 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
21c10 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
21c20 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
21c30 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
21c40 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
21c50 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
21c60 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
21c70 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
21c80 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
21c90 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
21ca0 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
21cb0 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
21cc0 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
21cd0 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
21ce0 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
21cf0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
21d00 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
21d10 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
21d20 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
21d30 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
21d40 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
21d50 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
21d60 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
21d70 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
21d80 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
21d90 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
21da0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
21db0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
21dc0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21de0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
21df0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
21e00 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
21e10 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
21e20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
21e30 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
21e40 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
21e50 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
21e60 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
21e70 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
21e80 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
21e90 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
21ea0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
21eb0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
21ec0 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
21ed0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
21ee0 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
21ef0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
21f00 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
21f10 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
21f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f30 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
21f40 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
21f50 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
21f60 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
21f70 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
21f80 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
21f90 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
21fa0 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
21fb0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
21fc0 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
21fd0 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
21fe0 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22000 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
22010 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
22020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
22030 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
22040 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
22050 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
22060 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
22070 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
22080 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
22090 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
220a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
220b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
220c0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
220d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
220e0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
220f0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
22100 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
22110 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
22120 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
22130 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
22140 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
22150 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
22160 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
22170 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
22180 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
22190 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
221a0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
221b0 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
221c0 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
221d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
221e0 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69  ID && pCur->vali
221f0 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75  dNKey .   && pCu
22200 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
22210 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69  tKey .  ){.    i
22220 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
22230 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
22240 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
22250 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22260 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
22270 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73   if( pCur->atLas
22280 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t && pCur->info.
22290 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
222a0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
222b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
222c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
222d0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
222e0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
222f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
22300 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
22310 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22320 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
22330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22340 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22350 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
22360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22370 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22380 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  Page]->nCell>0 |
22390 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
223a0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
223b0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
223c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
223d0 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
223e0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
223f0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
22400 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
22410 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
22420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22430 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
22440 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
22450 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  intKey || pIdxKe
22460 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
22470 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
22480 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
22490 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
224a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
224b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
224c0 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20  ];.    int c;.. 
224d0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
224e0 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
224f0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
22500 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
22510 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
22520 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
22530 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
22540 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
22550 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
22560 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
22570 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
22580 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
22590 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
225a0 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
225b0 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
225c0 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
225d0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
225e0 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
225f0 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
22600 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
22610 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
22620 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
22630 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
22640 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
22650 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
22660 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
22670 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
22680 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
22690 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
226a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
226b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
226c0 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
226d0 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
226e0 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
226f0 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69  ll-1;.    if( bi
22700 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  asRight ){.     
22710 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22720 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
22730 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  )upr;.    }else{
22740 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
22750 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
22760 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72  = (u16)((upr+lwr
22770 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
22780 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69  for(;;){.      i
22790 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
227a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
227b0 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ]; /* Index of c
227c0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
227d0 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 38  Page */.      u8
227e0 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22800 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
22810 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
22820 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20  pPage */..      
22830 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
22840 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c   = 0;.      pCel
22850 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
22860 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
22870 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
22880 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
22890 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
228a0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
228b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
228c0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
228d0 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
228e0 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
228f0 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
22900 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29  32(pCell, dummy)
22910 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22920 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
22930 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
22940 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
22950 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  f( nCellKey==int
22960 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
22970 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
22980 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
22990 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
229a0 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20         c = -1;. 
229b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
229c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
229d0 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
229e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
229f0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
22a00 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c         pCur->val
22a10 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
22a20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
22a30 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
22a40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22a50 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
22a60 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
22a70 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36 38  ge-size is 32768
22a80 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
22a90 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
22aa0 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
22ab0 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
22ac0 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
22ad0 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
22ae0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
22af0 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38 20  is at most 8198 
22b00 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61 79  bytes, which may
22b10 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
22b20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
22b30 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
22b40 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
22b50 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
22b60 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
22b70 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
22b80 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
22b90 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
22ba0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
22bb0 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
22bc0 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
22bd0 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
22be0 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
22bf0 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
22c00 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
22c10 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
22c20 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
22c30 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
22c40 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
22c50 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c        if( !(nCel
22c60 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43 65  l & 0x80) && nCe
22c70 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ll<=pPage->maxLo
22c80 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cal ){.         
22c90 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
22ca0 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
22cb0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
22cc0 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
22cd0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
22ce0 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
22cf0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
22d00 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
22d10 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
22d20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
22d30 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
22d40 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
22d50 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
22d60 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
22d70 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
22d80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
22d90 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
22da0 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
22db0 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
22dc0 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
22dd0 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
22de0 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
22df0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
22e00 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
22e10 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
22e20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
22e30 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
22e40 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
22e50 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
22e60 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
22e70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20   */.          c 
22e80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
22e90 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
22ea0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
22eb0 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
22ec0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22ed0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
22ee0 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
22ef0 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
22f00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
22f10 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
22f20 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
22f30 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
22f40 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
22f50 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
22f60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
22f70 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
22f80 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
22f90 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
22fa0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
22fb0 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
22fc0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
22fd0 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
22fe0 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  led. */.        
22ff0 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
23000 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
23010 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79   const pCellBody
23020 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65   = pCell - pPage
23030 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
23040 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 50            btreeP
23050 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
23060 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
23070 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
23080 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
23090 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
230a0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
230b0 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
230c0 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b  Malloc( nCell );
230d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
230e0 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
230f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23100 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
23110 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
23120 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
23130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23140 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
23150 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
23160 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
23170 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
23180 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  0);.          c 
23190 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
231a0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
231b0 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
231c0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
231d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
231e0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
231f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
23200 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
23210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23220 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
23230 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
23240 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
23250 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
23260 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
23270 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
23280 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
23290 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
232a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
232b0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
232c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
232d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
232e0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
232f0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
23300 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23310 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
23320 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
23330 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
23340 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
23350 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
23360 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
23370 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
23380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
23390 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
233a0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
233b0 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20  (lwr+upr)/2);.  
233c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
233d0 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20  lwr==upr+1 );.  
233e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
233f0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
23400 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
23410 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
23420 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
23430 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
23440 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
23450 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
23460 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
23470 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
23480 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
23490 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
234a0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
234b0 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
234c0 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50   }.    if( chldP
234d0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  g==0 ){.      as
234e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
234f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
23500 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23510 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
23520 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
23530 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
23540 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
23550 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
23560 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
23570 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23580 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
23590 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
235a0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
235b0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
235c0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
235d0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
235e0 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
235f0 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
23600 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d  to_finish;.  }.m
23610 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
23620 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
23630 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
23640 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
23650 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
23660 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
23670 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
23680 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
23690 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
236a0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
236b0 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
236c0 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
236d0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
236e0 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
236f0 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
23700 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
23710 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
23720 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
23730 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
23740 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
23750 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
23760 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
23770 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
23780 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
23790 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
237a0 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
237b0 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
237c0 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
237d0 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
237e0 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
237f0 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
23800 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
23810 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
23820 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
23830 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
23840 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
23850 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
23860 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
23870 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
23880 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
23890 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
238a0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
238b0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
238c0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
238d0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
238e0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
238f0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
23900 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
23910 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
23920 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
23930 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
23940 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23950 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
23960 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
23970 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
23980 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
23990 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
239a0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
239b0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
239c0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
239d0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
239e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
239f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
23a00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
23a10 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
23a20 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
23a30 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
23a40 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
23a50 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
23a60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
23a70 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
23a80 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
23a90 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
23aa0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
23ab0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23ac0 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
23ad0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
23ae0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23af0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
23b00 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
23b10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
23b20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
23b30 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
23b40 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e  rt( idx<=pPage->
23b50 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72  nCell );..  pCur
23b60 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
23b70 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
23b80 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  Key = 0;.  if( i
23b90 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
23ba0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
23bb0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
23bc0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
23bd0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
23be0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
23bf0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
23c00 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
23c10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
23c20 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
23c30 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
23c40 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
23c50 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
23c60 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rc;.    }.    do
23c70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
23c80 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
23c90 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
23ca0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
23cb0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
23cc0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
23cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23cf0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
23d00 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
23d10 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
23d20 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
23d30 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
23d40 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23d50 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
23d60 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
23d70 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
23d80 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
23d90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
23da0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
23db0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
23dc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23dd0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
23de0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
23df0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
23e00 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
23e10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23e20 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
23e30 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
23e40 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
23e50 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74  rc;.}.../*.** St
23e60 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
23e70 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
23e80 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
23e90 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
23ea0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
23eb0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
23ec0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
23ed0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
23ee0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
23ef0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
23f00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
23f10 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
23f20 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
23f30 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
23f40 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
23f50 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
23f60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23f70 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
23f80 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
23f90 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
23fa0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23fb0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
23fc0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
23fd0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
23fe0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
23ff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
24000 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
24010 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
24020 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
24030 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
24040 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
24050 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
24060 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
24070 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30  if( pCur->skip<0
24080 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
24090 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
240a0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
240b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
240c0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
240d0 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
240e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
240f0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
24100 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
24110 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
24120 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
24130 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
24140 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24150 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
24160 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
24170 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
24180 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
24190 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
241a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
241b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
241c0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
241d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
241e0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
241f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
24200 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
24210 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
24220 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
24230 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24240 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
24250 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
24260 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24270 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
24280 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
24290 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
242a0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
242b0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
242c0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
242d0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
242e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
242f0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
24300 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24310 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
24320 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
24330 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
24340 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24350 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
24360 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
24370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24380 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24390 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
243a0 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
243b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
243c0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
243d0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
243e0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
243f0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
24400 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
24410 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
24420 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
24430 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
24440 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
24450 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
24460 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
24470 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
24480 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
24490 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
244a0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
244b0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
244c0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
244d0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
244e0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
244f0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
24500 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
24510 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
24520 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
24530 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
24540 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
24550 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
24560 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
24570 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
24580 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
24590 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
245a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
245b0 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
245c0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
245d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
245e0 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
245f0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
24600 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
24610 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
24620 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
24630 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
24640 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
24650 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
24660 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
24670 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
24680 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
24690 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
246a0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
246b0 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
246c0 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
246d0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
246e0 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
246f0 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
24700 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
24710 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
24720 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
24730 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
24740 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
24750 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
24760 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
24770 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
24780 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
24790 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
247a0 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
247b0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
247c0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
247d0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
247e0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
247f0 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
24800 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
24810 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
24820 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
24830 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
24840 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
24850 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
24860 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24870 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
24880 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
24890 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
248a0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
248b0 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
248c0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
248d0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
248e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
248f0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
24900 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
24910 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
24920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24930 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
24940 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24950 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
24960 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
24970 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
24980 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
24990 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d  ount(pBt);.  n =
249a0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
249b0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
249c0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
249d0 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
249e0 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
249f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24a00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24a10 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
24a20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
24a30 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
24a40 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
24a50 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
24a60 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
24a70 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
24a80 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
24a90 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
24aa0 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
24ab0 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
24ac0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
24ad0 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
24ae0 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
24af0 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
24b00 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
24b10 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
24b20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
24b30 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
24b40 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
24b50 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
24b60 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
24b70 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
24b80 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
24b90 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
24ba0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
24bb0 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
24bc0 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61   && nearby<=mxPa
24bd0 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  ge ){.      u8 e
24be0 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
24bf0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
24c00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
24c10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
24c20 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
24c30 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
24c40 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
24c50 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
24c60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
24c70 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
24c80 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
24c90 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
24ca0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
24cb0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
24cc0 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
24cd0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
24ce0 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
24cf0 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
24d00 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
24d10 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
24d20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
24d30 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
24d40 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
24d50 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
24d60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24d70 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
24d80 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
24d90 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
24da0 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
24db0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
24dc0 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
24dd0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
24de0 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
24df0 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
24e00 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
24e10 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
24e20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
24e30 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
24e40 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
24e50 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
24e60 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
24e70 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
24e80 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
24e90 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
24ea0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
24eb0 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
24ec0 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
24ed0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
24ee0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
24ef0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
24f00 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
24f10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24f20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
24f30 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
24f40 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
24f50 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
24f60 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
24f70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
24f80 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
24f90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24fa0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24fb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24fc0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
24fd0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
24fe0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
24ff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25000 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
25010 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
25020 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
25030 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
25040 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d      }..      k =
25050 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
25060 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
25070 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6b 3d      testcase( k=
25080 3d 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  =(u32)(pBt->usab
25090 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 3b  leSize/4 - 2) );
250a0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
250b0 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
250c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
250d0 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
250e0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
250f0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
25100 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
25110 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
25120 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
25130 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
25140 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
25150 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
25160 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
25170 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
25180 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
25190 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
251a0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
251b0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
251c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
251d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
251e0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
251f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25200 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
25210 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
25220 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
25230 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
25240 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
25250 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
25260 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
25270 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
25280 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
25290 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
252a0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
252b0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
252c0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
252d0 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
252e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
252f0 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
25300 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
25310 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
25320 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
25330 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
25340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25350 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
25360 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
25370 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
25380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
25390 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
253a0 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
253b0 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d  List && nearby==
253c0 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
253d0 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
253e0 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
253f0 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
25400 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
25410 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
25420 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
25430 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
25440 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
25450 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25460 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d  assert( *pPgno==
25470 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20  iTrunk );.      
25480 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
25490 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
254a0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
254b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
254c0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
254d0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
254e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
254f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
25500 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
25510 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25520 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
25530 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
25540 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
25550 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
25560 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
25570 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
25580 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
25590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
255a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
255b0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
255c0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
255d0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
255e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
255f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25600 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
25610 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
25620 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
25630 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
25640 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
25650 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
25660 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
25670 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
25680 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
25690 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
256a0 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
256b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
256c0 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
256d0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
256e0 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
256f0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
25700 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
25710 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
25720 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
25730 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25740 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25750 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
25760 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25770 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
25780 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
25790 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
257a0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
257b0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
257c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
257d0 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
257e0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
257f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25810 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
25820 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
25830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25840 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25850 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
25860 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
25870 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
25880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25890 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
258a0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
258b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
258c0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
258d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
258e0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
258f0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
25900 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
25910 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
25920 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
25930 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
25940 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
25950 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
25960 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
25970 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
25980 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
25990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
259a0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
259b0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
259c0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
259d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
259e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
259f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
25a00 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
25a10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
25a20 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
25a30 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
25a40 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
25a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25a60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25a70 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
25a80 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
25a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25aa0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
25ab0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
25ac0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
25ad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25ae0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
25af0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
25b00 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
25b10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
25b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25b30 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
25b40 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
25b50 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
25b60 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
25b70 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
25b80 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
25b90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
25ba0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
25bb0 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
25bc0 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
25bd0 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
25be0 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
25bf0 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
25c00 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
25c10 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
25c20 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
25c30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25c40 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
25c50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
25c60 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25c70 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
25c80 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
25c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25ca0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
25cb0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
25cc0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64  .          int d
25cd0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
25ce0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
25cf0 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74        dist = get
25d00 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
25d10 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
25d20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20       if( dist<0 
25d30 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a  ) dist = -dist;.
25d40 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
25d50 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
25d60 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
25d70 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
25d80 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
25d90 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rby;.           
25da0 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d   if( d2<0 ) d2 =
25db0 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20   -d2;.          
25dc0 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
25dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
25de0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
25df0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
25e00 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
25e10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
25e20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25e30 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
25e40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
25e50 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
25e60 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
25e70 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
25e80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25e90 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
25ea0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
25eb0 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
25ec0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25ed0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
25ef0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
25f00 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
25f10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25f20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
25f30 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
25f40 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
25f50 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
25f60 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
25f70 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
25f80 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
25f90 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
25fa0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
25fb0 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
25fc0 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
25fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25fe0 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
25ff0 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
26000 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
26010 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
26020 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
26030 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
26040 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
26050 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
26060 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
26070 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
26080 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
26090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
260a0 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
260b0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
260c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
260d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
260e0 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70  teable(pTrunk->p
260f0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
26100 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
26110 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
26120 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
26130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
26140 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
26150 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
26160 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
26170 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26190 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
261a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
261b0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
261c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
261d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
261e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
261f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
26200 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
26210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26230 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
26240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26250 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
26260 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
26270 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
26280 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
26290 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
262a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
262b0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
262c0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
262d0 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
262e0 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
262f0 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
26300 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  he file */.    i
26310 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72  nt nPage = pager
26320 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
26330 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61      *pPgno = nPa
26340 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28  ge + 1;..    if(
26350 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
26360 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
26370 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  ){.      (*pPgno
26380 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  )++;.    }..#ifn
26390 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
263a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
263b0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
263c0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
263d0 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
263e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
263f0 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
26400 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
26410 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
26420 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
26430 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
26440 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
26450 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
26460 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
26470 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
26480 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
26490 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
264a0 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
264b0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
264c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
264d0 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
264e0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
264f0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
26500 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
26510 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
26520 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
26530 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
26540 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
26550 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
26560 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
26570 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
26580 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  o, &pPg, 0);.   
26590 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
265a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
265b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
265c0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
265d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
265e0 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
265f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26600 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
26610 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  ;.      (*pPgno)
26620 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  ++;.      if( *p
26630 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
26640 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
26650 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20  (*pPgno)++; }.  
26660 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
26670 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
26680 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
26690 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
266a0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
266b0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
266c0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
266d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
266e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
266f0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
26700 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
26710 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26730 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
26740 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
26750 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
26760 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
26770 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
26780 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
26790 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
267a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
267b0 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
267c0 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
267d0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
267e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
267f0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
26800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26810 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
26820 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
26830 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
26840 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
26850 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
26860 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
26870 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
26880 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
26890 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
268a0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
268b0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
268c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
268d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
268e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
268f0 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
26900 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
26910 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
26920 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
26930 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
26940 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
26950 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
26960 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
26970 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
26980 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
26990 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
269a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
269b0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
269c0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
269d0 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
269e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
269f0 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
26a00 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
26a10 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
26a20 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
26a30 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
26a40 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
26a50 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
26a60 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
26a70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
26a80 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
26a90 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
26aa0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
26ab0 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
26ac0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
26ad0 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
26ae0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
26af0 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
26b00 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
26b10 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
26b20 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
26b30 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
26b40 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
26b50 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
26b60 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
26b70 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
26b80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26b90 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
26ba0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
26bb0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
26bc0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
26bd0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
26be0 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
26bf0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
26c00 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
26c10 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c30 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
26c40 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
26c50 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
26c80 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
26c90 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
26cc0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
26cd0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
26ce0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
26cf0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
26d00 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
26d10 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  t( iPage>1 );.  
26d20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
26d30 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
26d40 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
26d50 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
26d60 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
26d70 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
26d80 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
26d90 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
26da0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
26db0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
26dc0 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
26dd0 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
26de0 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
26df0 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
26e00 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
26e10 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
26e20 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
26e30 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
26e40 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
26e50 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
26e60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
26e70 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
26e80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
26e90 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69  ], nFree+1);..#i
26ea0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
26eb0 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49  RE_DELETE.  /* I
26ec0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43  f the SQLITE_SEC
26ed0 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69  URE_DELETE compi
26ee0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
26ef0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
26f00 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
26f10 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
26f20 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
26f30 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f  with zeros..  */
26f40 0a 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26  .  if( (!pPage &
26f50 26 20 28 72 63 20 3d 20 62 74 72 65 65 47 65 74  & (rc = btreeGet
26f60 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
26f70 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20   &pPage, 0))).  
26f80 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
26f90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26fa0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
26fb0 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20  bPage)).  ){.   
26fc0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26fd0 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ut;.  }.  memset
26fe0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
26ff0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
27000 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
27010 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
27020 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
27030 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
27040 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
27050 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
27060 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
27070 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
27080 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
27090 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
270a0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
270b0 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
270c0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
270d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
270e0 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
270f0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
27100 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
27110 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
27120 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
27130 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
27140 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
27150 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
27160 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
27170 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
27180 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
27190 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
271a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
271b0 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
271c0 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
271d0 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
271e0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
271f0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
27200 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
27210 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
27220 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
27230 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
27240 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
27250 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
27260 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
27270 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
27280 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
27290 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
272a0 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
272b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61   ){.    int nLea
272c0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
272d0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
272e0 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
272f0 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
27300 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
27310 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
27320 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
27330 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
27340 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
27350 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
27360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
27380 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
27390 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
273a0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
273b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
273c0 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 30  .    if( nLeaf<0
273d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
273e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
273f0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
27400 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
27410 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
27420 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  <pBt->usableSize
27430 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
27440 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
27450 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
27460 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
27470 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
27480 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
27490 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
274a0 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
274b0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
274c0 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
274d0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
274e0 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
274f0 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
27500 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
27510 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
27520 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
27530 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
27540 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
27550 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
27560 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
27570 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
27580 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
27590 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
275a0 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
275b0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
275c0 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
275d0 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
275e0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
275f0 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
27600 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
27610 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
27620 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
27630 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
27640 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
27650 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
27660 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
27670 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  we will contain 
27680 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
27690 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
276a0 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
276b0 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
276c0 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
276d0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
276e0 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
276f0 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
27700 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
27710 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
27720 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
27730 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
27740 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
27750 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
27760 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
27770 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
27780 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
27790 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
277a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
277b0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
277c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
277d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
277e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
277f0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
27800 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
27810 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
27820 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
27830 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
27840 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27850 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
27860 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
27870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
27880 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
27890 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
278a0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  e);.        }.#e
278b0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63 20  ndif.        rc 
278c0 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
278d0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
278e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
278f0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
27900 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
27910 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
27920 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
27930 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
27940 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
27950 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
27960 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
27970 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
27980 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
27990 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
279a0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
279b0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
279c0 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
279d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
279e0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
279f0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
27a00 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
27a10 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
27a20 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
27a30 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
27a40 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
27a50 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
27a60 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
27a70 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
27a80 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
27a90 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
27aa0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
27ab0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
27ac0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
27ad0 20 20 28 28 21 70 50 61 67 65 29 20 26 26 20 28    ((!pPage) && (
27ae0 30 20 21 3d 20 28 72 63 20 3d 20 62 74 72 65 65  0 != (rc = btree
27af0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
27b00 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29  ge, &pPage, 0)))
27b10 29 0a 20 20 20 20 20 7c 7c 20 28 30 20 21 3d 20  ).     || (0 != 
27b20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
27b30 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
27b40 44 62 50 61 67 65 29 29 29 0a 20 20 29 7b 0a 20  DbPage))).  ){. 
27b50 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
27b60 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
27b70 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
27b80 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
27b90 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
27ba0 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
27bb0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
27bc0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
27bd0 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
27be0 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
27bf0 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
27c00 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
27c10 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
27c20 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
27c30 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
27c40 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
27c50 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
27c60 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
27c70 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
27c80 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
27c90 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69  n rc;.}.static i
27ca0 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  nt freePage(MemP
27cb0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  age *pPage){.  r
27cc0 65 74 75 72 6e 20 66 72 65 65 50 61 67 65 32 28  eturn freePage2(
27cd0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
27ce0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
27cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
27d00 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
27d10 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
27d20 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
27d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27d40 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
27d50 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
27d60 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
27d70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
27d80 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
27d90 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
27da0 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
27db0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
27dc0 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76   nOvfl;.  u16 ov
27dd0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
27de0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
27df0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
27e00 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
27e10 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
27e20 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
27e30 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
27e40 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
27e50 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
27e60 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
27e70 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
27e80 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
27e90 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
27ea0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
27eb0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
27ec0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
27ed0 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
27ee0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
27ef0 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
27f00 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
27f10 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
27f20 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
27f30 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
27f40 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
27f50 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
27f60 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
27f70 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
27f80 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
27f90 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
27fa0 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
27fb0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
27fc0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
27fd0 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
27fe0 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61  ovflPgno>pagerPa
27ff0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
28000 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
28010 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
28020 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
28030 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
28040 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
28050 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
28060 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
28070 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
28080 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
28090 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
280a0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
280b0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
280c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
280d0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
280e0 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
280f0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
28100 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
28110 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
28120 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
28130 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
28140 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
28150 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
28160 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
28170 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76 66  o);.    if( pOvf
28180 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
28190 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
281a0 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
281b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
281c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
281d0 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
281e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
281f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28200 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
28210 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
28220 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
28230 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
28240 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
28250 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
28260 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
28270 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
28280 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
28290 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
282a0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
282b0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
282c0 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
282d0 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
282e0 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
282f0 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
28300 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
28310 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
28320 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
28330 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
28340 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
28350 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
28360 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
28370 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
28380 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
28390 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
283a0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
283b0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
283c0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
283d0 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
283e0 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
283f0 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
28400 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
28410 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
28420 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
28430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
28440 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
28450 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
28460 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
28470 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
28480 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
28490 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
284a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
284b0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
284c0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
284d0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
284e0 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
284f0 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
28500 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28520 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
28530 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
28540 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
28550 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
28560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
28570 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
28580 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
28590 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
285a0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
285b0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
285c0 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
285d0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
285e0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
285f0 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
28600 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
28610 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
28620 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
28630 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
28640 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
28650 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
28660 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
28670 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
28680 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
28690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
286a0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
286b0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
286c0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
286d0 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
286e0 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
286f0 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
28700 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
28710 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
28720 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
28730 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
28740 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
28750 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
28760 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
28770 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
28780 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
28790 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
287a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
287b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
287c0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
287d0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
287e0 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
287f0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
28800 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
28810 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
28820 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
28830 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
28840 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
28850 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
28860 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
28870 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
28880 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
28890 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
288a0 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
288b0 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
288c0 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  y);.  btreeParse
288d0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
288e0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
288f0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
28900 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
28910 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
28920 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
28930 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
28940 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
28950 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
28960 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
28970 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
28980 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
28990 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
289a0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
289b0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
289c0 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
289d0 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
289e0 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
289f0 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66   nKey>0x7fffffff
28a00 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20   || pKey==0 ){. 
28a10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28a20 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
28a30 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  }.    nPayload +
28a40 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
28a50 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
28a60 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
28a70 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
28a80 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
28a90 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
28aa0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
28ab0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
28ac0 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
28ad0 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
28ae0 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
28af0 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
28b00 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
28b10 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
28b20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28b30 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
28b40 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
28b50 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
28b60 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
28b70 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
28b80 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
28b90 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
28ba0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
28bb0 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
28bc0 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
28bd0 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
28be0 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
28bf0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
28c00 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
28c10 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
28c20 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
28c30 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
28c40 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
28c50 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
28c60 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
28c70 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
28c80 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
28c90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
28ca0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
28cb0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
28cc0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
28cd0 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
28ce0 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
28cf0 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
28d00 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
28d10 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
28d20 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
28d30 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
28d40 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
28d50 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
28d60 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
28d70 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
28d80 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
28d90 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
28da0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
28db0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
28dc0 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
28dd0 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
28de0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
28df0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
28e00 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
28e10 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
28e20 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
28e30 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
28e40 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
28e50 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
28e60 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
28e70 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
28e80 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
28e90 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
28ea0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
28eb0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
28ec0 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
28ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28ee0 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
28ef0 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
28f00 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
28f10 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
28f20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
28f30 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
28f40 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
28f50 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  map);.        if
28f60 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
28f70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
28f80 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
28f90 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
28fa0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
28fb0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
28fc0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
28fd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
28fe0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
28ff0 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
29000 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
29010 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
29020 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
29030 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
29040 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
29050 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
29060 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
29070 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
29080 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
29090 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
290a0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
290b0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
290c0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
290d0 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
290e0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
290f0 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
29100 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
29110 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
29120 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
29130 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
29140 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
29150 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
29160 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
29170 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
29180 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
29190 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
291a0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
291b0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
291c0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
291d0 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
291e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
291f0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
29200 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
29210 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
29220 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
29230 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
29240 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
29250 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
29260 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
29270 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
29280 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
29290 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
292a0 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
292b0 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
292c0 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
292d0 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
292e0 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
292f0 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
29300 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
29310 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
29320 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
29330 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
29340 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
29350 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
29360 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
29370 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
29380 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29390 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
293a0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
293b0 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
293c0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
293d0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
293e0 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
293f0 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
29400 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
29410 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
29420 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
29430 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
29440 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
29450 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
29460 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
29470 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29480 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
29490 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
294a0 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
294b0 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
294c0 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
294d0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
294e0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
294f0 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
29500 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29510 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
29520 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
29530 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
29540 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
29550 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
29560 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
29570 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
29580 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
29590 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
295a0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
295b0 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
295c0 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
295d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
295e0 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
295f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29600 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
29610 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
29620 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
29630 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
29640 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
29650 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
29660 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
29670 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
29680 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
29690 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
296a0 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
296b0 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
296c0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
296d0 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
296e0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
296f0 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
29700 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
29710 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
29720 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
29730 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
29740 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65 6c  atic int dropCel
29750 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
29760 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
29770 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
29780 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
29790 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
297a0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
297b0 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
297c0 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
297d0 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
297e0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
297f0 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
29800 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
29810 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
29820 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
29830 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
29840 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
29850 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
29860 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
29870 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
29880 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
29890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
298a0 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
298b0 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
298c0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
298d0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
298e0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
298f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29900 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
29910 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
29920 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
29930 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
29940 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
29950 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78  llOffset + 2*idx
29960 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
29970 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20 28  te(ptr);.  if( (
29980 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  pc<pPage->hdrOff
29990 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
299a0 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c  af?0:4)).     ||
299b0 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70   (pc+sz>pPage->p
299c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20  Bt->usableSize) 
299d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
299e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
299f0 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  T;.  }.  rc = fr
29a00 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
29a10 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
29a20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29a30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29a40 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b  }.  for(i=idx+1;
29a50 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
29a60 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20   i++, ptr+=2){. 
29a70 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
29a80 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d  2];.    ptr[1] =
29a90 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70   ptr[3];.  }.  p
29aa0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
29ab0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
29ac0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
29ad0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
29ae0 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
29af0 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72  ee += 2;.  retur
29b00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29b10 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
29b20 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
29b30 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
29b40 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
29b50 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
29b60 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
29b70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
29b80 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
29b90 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
29ba0 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
29bb0 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
29bc0 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
29bd0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
29be0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
29bf0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
29c00 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
29c10 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
29c20 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
29c30 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
29c40 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
29c50 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
29c60 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
29c70 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
29c80 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
29c90 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
29ca0 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
29cb0 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
29cc0 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
29cd0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
29ce0 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
29cf0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
29d00 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
29d10 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
29d20 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
29d30 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
29d40 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
29d50 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
29d60 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
29d70 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
29d80 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
29d90 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
29da0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
29db0 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
29dc0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
29dd0 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
29de0 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
29df0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
29e00 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
29e10 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
29e20 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
29e30 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  int insertCell(.
29e40 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
29e50 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
29e60 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
29e70 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
29e80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29e90 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
29ea0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
29eb0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
29ec0 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
29ed0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
29ee0 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
29ef0 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
29f00 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
29f10 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
29f20 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
29f30 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
29f40 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
29f50 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
29f60 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
29f70 69 6c 64 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ild       /* If 
29f80 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
29f90 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
29fa0 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
29fb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b  */.){.  int idx;
29fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
29fd0 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
29fe0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
29ff0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2a000 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
2a010 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2a020 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
2a030 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
2a040 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
2a050 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2a060 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2a070 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
2a080 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
2a090 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
2a0a0 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
2a0b0 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65  rted */.  int ce
2a0c0 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
2a0d0 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
2a0e0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2a0f0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2a100 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
2a110 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
2a120 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
2a130 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2a140 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
2a150 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
2a160 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
2a170 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20  ata[] */..  int 
2a180 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20  nSkip = (iChild 
2a190 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73  ? 4 : 0);..  ass
2a1a0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
2a1b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
2a1c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
2a1d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a1e0 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
2a1f0 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
2a200 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2a210 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61  Bt)<=5460 );.  a
2a220 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2a230 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
2a240 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29  ze(pPage->aOvfl)
2a250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
2a260 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2a270 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20  age, pCell) );. 
2a280 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a290 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2a2a0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2a2b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
2a2c0 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
2a2d0 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
2a2e0 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
2a2f0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2a300 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
2a310 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2a320 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
2a330 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
2a340 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2a350 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2a360 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
2a370 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
2a380 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
2a390 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2a3a0 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
2a3b0 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
2a3c0 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
2a3d0 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ])) );.    pPage
2a3e0 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
2a3f0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
2a400 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
2a410 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  x = (u16)i;.  }e
2a420 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
2a430 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a440 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2a450 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2a460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a470 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a480 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2a490 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2a4a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2a4b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2a4c0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2a4d0 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  ata;.    cellOff
2a4e0 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
2a4f0 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
2a500 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
2a510 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
2a520 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
2a530 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
2a540 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
2a550 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
2a560 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
2a570 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2a580 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 65 6e   assert( idx>=en
2a590 64 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20 69  d+2 );.    if( i
2a5a0 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  dx+sz > pPage->p
2a5b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2a5c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2a5d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2a5e0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  PT;.    }.    pP
2a5f0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
2a600 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
2a610 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b  = (u16)(2 + sz);
2a620 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
2a630 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43  a[idx+nSkip], pC
2a640 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
2a650 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43  kip);.    if( iC
2a660 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
2a670 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
2a680 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
2a690 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c  }.    for(j=end,
2a6a0 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
2a6b0 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
2a6c0 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
2a6d0 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
2a6e0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
2a6f0 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
2a700 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
2a710 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
2a720 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
2a730 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
2a740 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
2a750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a760 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2a770 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
2a780 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2a790 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
2a7a0 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
2a7b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2a7c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
2a7d0 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
2a7e0 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
2a7f0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
2a800 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
2a810 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
2a820 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
2a830 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
2a840 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
2a850 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2a860 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2a870 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2a880 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
2a890 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
2a8a0 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
2a8b0 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
2a8c0 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
2a8d0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
2a8e0 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
2a8f0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
2a900 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
2a910 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a920 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
2a930 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
2a940 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
2a950 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2a960 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2a970 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
2a980 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2a990 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
2a9a0 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
2a9b0 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a  odies */.  u16 *
2a9c0 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
2a9d0 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
2a9e0 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
2a9f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2aa00 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2aa10 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20    u8 *pCellptr; 
2aa20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2aa30 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
2aa40 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
2aa50 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
2aa60 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2aa70 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
2aa80 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
2aa90 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
2aaa0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2aab0 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
2aac0 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2aad0 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
2aae0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
2aaf0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2ab00 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50   of header on pP
2ab10 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
2ab20 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61  nt nUsable = pPa
2ab30 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2ab40 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73  ize; /* Usable s
2ab50 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a  ize of page */..
2ab60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2ab70 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2ab80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ab90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2aba0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2abb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
2abc0 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c  ell>=0 && nCell<
2abd0 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
2abe0 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28  pBt) && MX_CELL(
2abf0 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36  pPage->pBt)<=546
2ac00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
2ac10 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2ac20 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2ac30 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
2ac40 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
2ac50 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  age has just bee
2ac60 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f  n zeroed by zero
2ac70 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65  Page() */.  asse
2ac80 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2ac90 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2aca0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2acb0 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65  hdr+5])==nUsable
2acc0 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20   );..  pCellptr 
2acd0 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
2ace0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
2acf0 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79  l*2];.  cellbody
2ad00 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f   = nUsable;.  fo
2ad10 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d  r(i=nCell-1; i>=
2ad20 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65  0; i--){.    pCe
2ad30 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20  llptr -= 2;.    
2ad40 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a  cellbody -= aSiz
2ad50 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79  e[i];.    put2by
2ad60 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c  te(pCellptr, cel
2ad70 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63  lbody);.    memc
2ad80 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
2ad90 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
2ada0 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  Size[i]);.  }.  
2adb0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2adc0 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
2add0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2ade0 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79  hdr+5], cellbody
2adf0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2ae00 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20  e -= (nCell*2 + 
2ae10 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f  nUsable - cellbo
2ae20 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  dy);.  pPage->nC
2ae30 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c  ell = (u16)nCell
2ae40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
2ae50 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
2ae60 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
2ae70 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
2ae80 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
2ae90 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
2aea0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2aeb0 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
2aec0 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
2aed0 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
2aee0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
2aef0 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
2af00 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
2af10 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
2af20 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
2af30 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
2af40 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
2af50 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
2af60 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
2af70 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
2af80 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
2af90 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
2afa0 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
2afb0 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
2afc0 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
2afd0 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
2afe0 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
2aff0 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
2b000 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
2b010 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
2b020 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
2b030 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
2b040 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
2b050 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
2b060 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
2b070 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
2b080 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
2b090 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
2b0a0 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
2b0b0 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
2b0c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b0d0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2b0e0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
2b0f0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
2b100 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
2b110 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
2b120 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
2b130 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  ance */...#ifnde
2b140 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
2b150 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
2b160 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
2b170 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
2b180 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
2b190 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
2b1a0 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
2b1b0 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
2b1c0 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
2b1d0 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
2b1e0 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
2b1f0 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
2b200 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
2b210 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
2b220 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
2b230 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
2b240 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
2b250 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ing balance the 
2b260 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
2b270 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
2b280 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
2b290 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
2b2a0 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
2b2b0 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
2b2c0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
2b2d0 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
2b2e0 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
2b2f0 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
2b300 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
2b310 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
2b320 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
2b330 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
2b340 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
2b350 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
2b360 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
2b370 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
2b380 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
2b390 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
2b3a0 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
2b3b0 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
2b3c0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
2b3d0 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
2b3e0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
2b3f0 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
2b400 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
2b410 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
2b420 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
2b430 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
2b440 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2b450 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
2b460 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65  **.** The pSpace
2b470 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
2b480 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f  to store a tempo
2b490 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  rary copy of the
2b4a0 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c   divider.** cell
2b4b0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
2b4c0 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72  serted into pPar
2b4d0 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c  ent. Such a cell
2b4e0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2b4f0 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75  .** byte page nu
2b500 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
2b510 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2b520 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f  th integer. In o
2b530 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
2b540 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e  t most 13 bytes.
2b550 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63   Hence the pSpac
2b560 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
2b570 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20   at.** least 13 
2b580 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
2b590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2b5a0 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
2b5b0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d  ge *pParent, Mem
2b5c0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
2b5d0 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68  *pSpace){.  BtSh
2b5e0 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20  ared *const pBt 
2b5f0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20  = pPage->pBt;   
2b600 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62   /* B-Tree Datab
2b610 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ase */.  MemPage
2b620 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
2b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b640 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
2b650 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
2b660 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b680 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2b690 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
2b6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2b6c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20   number of pNew 
2b6d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2b6e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2b6f0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2b700 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2b710 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2b720 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
2b730 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2b740 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2b750 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a  Overflow==1 );..
2b760 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
2b770 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll<=0 ) return S
2b780 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b790 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  PT;..  /* Alloca
2b7a0 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54  te a new page. T
2b7b0 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
2b7c0 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73  come the right-s
2b7d0 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20  ibling of .  ** 
2b7e0 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20  pPage. Make the 
2b7f0 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74  parent page writ
2b800 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68  able, so that th
2b810 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
2b820 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  ll.  ** may be i
2b830 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68  nserted. If both
2b840 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e   these operation
2b850 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c  s are successful
2b860 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  , proceed..  */.
2b870 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2b880 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2b890 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
2b8a0 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  , 0);..  if( rc=
2b8b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
2b8c0 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70     u8 *pOut = &p
2b8d0 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38  Space[4];.    u8
2b8e0 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d   *pCell = pPage-
2b8f0 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
2b900 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20  .    u16 szCell 
2b910 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2b920 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2b930 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20   u8 *pStop;..   
2b940 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2b950 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2b960 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20  (pNew->pDbPage) 
2b970 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2b980 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d  Page->aData[0]==
2b990 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
2b9a0 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
2b9b0 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  F) );.    zeroPa
2b9c0 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54  ge(pNew, PTF_INT
2b9d0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
2b9e0 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  |PTF_LEAF);.    
2b9f0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
2ba00 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
2ba10 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  zCell);..    /* 
2ba20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2ba30 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2ba40 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
2ba50 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a  ointer map.    *
2ba60 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
2ba70 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
2ba80 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
2ba90 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a   from the .    *
2baa0 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
2bab0 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
2bac0 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65  w page. If eithe
2bad0 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a  r of these.    *
2bae0 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69  * operations fai
2baf0 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63  ls, the return c
2bb00 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20  ode is set, but 
2bb10 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
2bb20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e   ** of the paren
2bb30 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c  t page are still
2bb40 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
2bb50 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a  thh code below..
2bb60 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f      ** That is O
2bb70 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  k, at this point
2bb80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2bb90 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2bba0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b  o.    ** be mark
2bbb0 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74  ed as dirty. Ret
2bbc0 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
2bbd0 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20  code will cause 
2bbe0 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  a.    ** rollbac
2bbf0 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63  k, undoing any c
2bc00 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
2bc10 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
2bc20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
2bc30 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2bc40 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2bc50 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
2bc60 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2bc70 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
2bc80 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2bc90 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
2bca0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2bcb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2bcc0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
2bcd0 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b 0a  r(pNew, pCell);.
2bce0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2bcf0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
2bd00 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f   divider cell to
2bd10 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61   insert into pPa
2bd20 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65  rent. The divide
2bd30 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  r cell.    ** co
2bd40 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79  nsists of a 4-by
2bd50 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  te page number (
2bd60 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2bd70 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20  of pPage) and.  
2bd80 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20    ** a variable 
2bd90 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65  length key value
2bda0 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
2bdb0 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61  the same value a
2bdc0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72  s the.    ** lar
2bdd0 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67  gest key on pPag
2bde0 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e)..    **.    *
2bdf0 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  * To find the la
2be00 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20  rgest key value 
2be10 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20  on pPage, first 
2be20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d  find the right-m
2be30 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  ost .    ** cell
2be40 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66   on pPage. The f
2be50 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20  irst two fields 
2be60 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65  of this cell are
2be70 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63   the .    ** rec
2be80 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61  ord-length (a va
2be90 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2bea0 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32  teger at most 32
2beb0 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20  -bits in size). 
2bec0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65     ** and the ke
2bed0 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61  y value (a varia
2bee0 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2bef0 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79  er, may have any
2bf00 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20   value)..    ** 
2bf10 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65  The first of the
2bf20 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2bf30 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76  s below skips ov
2bf40 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65  er the record-le
2bf50 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ngth.    ** fiel
2bf60 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68  d. The second wh
2bf70 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f  ile(...) loop co
2bf80 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c  pies the key val
2bf90 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ue from the.    
2bfa0 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2bfb0 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65   into the pSpace
2bfc0 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a   buffer..    */.
2bfd0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2bfe0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
2bff0 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  e->nCell-1);.   
2c000 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
2c010 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
2c020 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29  *(pCell++)&0x80)
2c030 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2c040 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
2c050 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
2c060 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29  ile( ((*(pOut++)
2c070 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30   = *(pCell++))&0
2c080 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2c090 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  top );..    /* I
2c0a0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69  nsert the new di
2c0b0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
2c0c0 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  pParent. */.    
2c0d0 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
2c0e0 6e 74 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  nt,pParent->nCel
2c0f0 6c 2c 70 53 70 61 63 65 2c 28 69 6e 74 29 28 70  l,pSpace,(int)(p
2c100 4f 75 74 2d 70 53 70 61 63 65 29 2c 30 2c 70 50  Out-pSpace),0,pP
2c110 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  age->pgno);..   
2c120 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68   /* Set the righ
2c130 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
2c140 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f  of pParent to po
2c150 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
2c160 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34  age. */.    put4
2c170 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2c180 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2c190 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2c1a0 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  New);.  .    /* 
2c1b0 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
2c1c0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
2c1d0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65   page. */.    re
2c1e0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
2c1f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2c200 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2c210 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
2c220 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  BALANCE */..#if 
2c230 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  0./*.** This fun
2c240 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
2c250 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69  ontribute anythi
2c260 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ng to the operat
2c270 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a  ion of SQLite..*
2c280 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65  * it is sometime
2c290 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70  s activated temp
2c2a0 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65  orarily while de
2c2b0 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73  bugging code res
2c2c0 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72  ponsible .** for
2c2d0 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72   setting pointer
2c2e0 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  -map entries..*/
2c2f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
2c300 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d  apCheckPages(Mem
2c310 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69  Page **apPage, i
2c320 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
2c330 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30   i, j;.  for(i=0
2c340 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  ; i<nPage; i++){
2c350 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20  .    Pgno n;.   
2c360 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61   u8 e;.    MemPa
2c370 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61  ge *pPage = apPa
2c380 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61  ge[i];.    BtSha
2c390 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2c3a0 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
2c3b0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2c3c0 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   );..    for(j=0
2c3d0 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; j<pPage->nCell
2c3e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65  ; j++){.      Ce
2c3f0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
2c400 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a     u8 *z;.     .
2c410 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65        z = findCe
2c420 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20  ll(pPage, j);.  
2c430 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
2c440 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20  llPtr(pPage, z, 
2c450 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  &info);.      if
2c460 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2c470 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2c480 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
2c490 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  (&z[info.iOverfl
2c4a0 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74  ow]);.        pt
2c4b0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66  rmapGet(pBt, ovf
2c4c0 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  l, &e, &n);.    
2c4d0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2c4e0 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2c4f0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
2c500 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1 );.      }.   
2c510 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2c520 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50  eaf ){.        P
2c530 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
2c540 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  byte(z);.       
2c550 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2c560 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
2c570 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c580 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2c590 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
2c5a0 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  E );.      }.   
2c5b0 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67   }.    if( !pPag
2c5c0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2c5d0 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
2c5e0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2c5f0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2c600 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20  ffset+8]);.     
2c610 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2c620 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
2c630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2c640 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2c650 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
2c660 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2c670 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2c680 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
2c690 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2c6a0 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  o copy the conte
2c6b0 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65  nts of the b-tre
2c6c0 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a  e node stored .*
2c6d0 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20  * on page pFrom 
2c6e0 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  to page pTo. If 
2c6f0 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e  page pFrom was n
2c700 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  ot a leaf page, 
2c710 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  then.** the poin
2c720 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
2c730 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70  for each child p
2c740 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20  age are updated 
2c750 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  so that the.** p
2c760 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65  arent page store
2c770 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  d in the pointer
2c780 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f   map is page pTo
2c790 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61  . If pFrom conta
2c7a0 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c  ined.** any cell
2c7b0 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  s with overflow 
2c7c0 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74  page pointers, t
2c7d0 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hen the correspo
2c7e0 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a  nding pointer.**
2c7f0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65   map entries are
2c800 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f   also updated so
2c810 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74   that the parent
2c820 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54   page is page pT
2c830 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  o..**.** If pFro
2c840 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63  m is currently c
2c850 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72  arrying any over
2c860 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72  flow cells (entr
2c870 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65  ies in the.** Me
2c880 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72  mPage.aOvfl[] ar
2c890 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e  ray), they are n
2c8a0 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f  ot copied to pTo
2c8b0 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  . .**.** Before 
2c8c0 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20  returning, page 
2c8d0 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c  pTo is reinitial
2c8e0 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65  ized using btree
2c8f0 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
2c900 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  * The performanc
2c910 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
2c920 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63  on is not critic
2c930 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  al. It is only u
2c940 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62  sed by .** the b
2c950 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
2c960 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64  () and balance_d
2c970 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72  eeper() procedur
2c980 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a  es, neither of.*
2c990 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c  * which are call
2c9a0 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e  ed often under n
2c9b0 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e  ormal circumstan
2c9c0 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ces..*/.static i
2c9d0 6e 74 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  nt copyNodeConte
2c9e0 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f  nt(MemPage *pFro
2c9f0 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 29  m, MemPage *pTo)
2ca00 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 20 63  {.  BtShared * c
2ca10 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d  onst pBt = pFrom
2ca20 2d 3e 70 42 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ->pBt;.  u8 * co
2ca30 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f  nst aFrom = pFro
2ca40 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  m->aData;.  u8 *
2ca50 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f   const aTo = pTo
2ca60 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 63  ->aData;.  int c
2ca70 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20  onst iFromHdr = 
2ca80 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74  pFrom->hdrOffset
2ca90 3b 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54  ;.  int const iT
2caa0 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67  oHdr = ((pTo->pg
2cab0 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30  no==1) ? 100 : 0
2cac0 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  );.  int rc = SQ
2cad0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
2cae0 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
2caf0 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29   pFrom->isInit )
2cb00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f  ;.  assert( pFro
2cb10 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72  m->nFree>=iToHdr
2cb20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
2cb30 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
2cb40 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d  romHdr+5])<=pBt-
2cb50 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a  >usableSize );..
2cb60 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d    /* Copy the b-
2cb70 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e  tree node conten
2cb80 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f  t from page pFro
2cb90 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a  m to page pTo. *
2cba0 2f 0a 20 20 69 44 61 74 61 20 3d 20 67 65 74 32  /.  iData = get2
2cbb0 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2cbc0 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  mHdr+5]);.  memc
2cbd0 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
2cbe0 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
2cbf0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
2cc00 44 61 74 61 29 3b 0a 20 20 6d 65 6d 63 70 79 28  Data);.  memcpy(
2cc10 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61  &aTo[iToHdr], &a
2cc20 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20  From[iFromHdr], 
2cc30 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65  pFrom->cellOffse
2cc40 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65  t + 2*pFrom->nCe
2cc50 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e 69  ll);..  /* Reini
2cc60 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f  tialize page pTo
2cc70 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
2cc80 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d  tents of the Mem
2cc90 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20  Page structure. 
2cca0 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65   ** match the ne
2ccb0 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74  w data. The init
2ccc0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54  ialization of pT
2ccd0 6f 20 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c  o "cannot" fail,
2cce0 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   as the.  ** dat
2ccf0 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46  a copied from pF
2cd00 72 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20  rom is known to 
2cd10 62 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20  be valid.  */.  
2cd20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  pTo->isInit = 0;
2cd30 0a 20 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d  .  TESTONLY(rc =
2cd40 20 29 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   ) btreeInitPage
2cd50 28 70 54 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  (pTo);.  assert(
2cd60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cd70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
2cd80 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
2cd90 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
2cda0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
2cdb0 61 70 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  ap entries.  ** 
2cdc0 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f  for any b-tree o
2cdd0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
2cde0 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f   that pTo now co
2cdf0 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
2ce00 65 72 73 20 74 6f 2e 20 2a 2f 0a 20 20 69 66 28  ers to. */.  if(
2ce10 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2ce20 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
2ce30 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a  ldPtrmaps(pTo);.
2ce40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ce50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2ce60 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
2ce70 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
2ce80 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
2ce90 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
2cea0 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
2ceb0 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
2cec0 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
2ced0 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
2cee0 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
2cef0 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
2cf00 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
2cf10 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
2cf20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
2cf30 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
2cf40 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
2cf50 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
2cf60 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
2cf70 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
2cf80 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
2cf90 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
2cfa0 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
2cfb0 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
2cfc0 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
2cfd0 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
2cfe0 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
2cff0 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
2d000 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
2d010 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
2d020 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
2d030 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
2d040 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
2d050 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
2d060 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
2d070 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
2d080 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
2d090 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
2d0a0 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
2d0b0 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
2d0c0 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
2d0d0 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
2d0e0 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
2d0f0 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
2d100 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
2d110 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
2d120 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
2d130 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2d140 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
2d150 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
2d160 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
2d170 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
2d180 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
2d190 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
2d1a0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
2d1b0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2d1c0 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
2d1d0 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
2d1e0 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
2d1f0 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
2d200 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
2d210 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
2d220 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
2d230 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2d240 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
2d250 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
2d260 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
2d270 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
2d280 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
2d290 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
2d2a0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
2d2b0 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
2d2c0 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
2d2d0 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
2d2e0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
2d2f0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
2d300 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
2d310 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
2d320 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
2d330 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
2d340 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
2d350 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
2d360 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
2d370 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
2d380 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
2d390 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
2d3a0 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
2d3b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
2d3c0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
2d3d0 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
2d3e0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
2d3f0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
2d400 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
2d410 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
2d420 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
2d430 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
2d440 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
2d450 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2d460 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
2d470 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
2d480 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2d490 61 0a 2a 2a 20 62 75 66 66 65 72 20 70 61 67 65  a.** buffer page
2d4a0 2d 73 69 7a 65 20 62 79 74 65 73 20 69 6e 20 73  -size bytes in s
2d4b0 69 7a 65 2e 20 49 66 2c 20 69 6e 20 69 6e 73 65  ize. If, in inse
2d4c0 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f  rting cells into
2d4d0 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70   the parent.** p
2d4e0 61 67 65 20 28 70 50 61 72 65 6e 74 29 2c 20 74  age (pParent), t
2d4f0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
2d500 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
2d510 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
2d520 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
2d530 20 74 68 65 20 70 61 72 65 6e 74 73 20 6f 76 65   the parents ove
2d540 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63  rflow cells. Bec
2d550 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  ause this functi
2d560 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20  on inserts.** a 
2d570 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20  maximum of four 
2d580 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
2d590 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2d5a0 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69  ge, and the maxi
2d5b0 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61  mum.** size of a
2d5c0 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74   cell stored wit
2d5d0 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  hin an internal 
2d5e0 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c  node is always l
2d5f0 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20  ess than 1/4.** 
2d600 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
2d610 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  , the aOvflSpace
2d620 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61  [] buffer is gua
2d630 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61  ranteed to be la
2d640 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f  rge.** enough fo
2d650 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63  r all overflow c
2d660 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ells..**.** If a
2d670 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74  OvflSpace is set
2d680 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   to a null point
2d690 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
2d6a0 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
2d6b0 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73  LITE_NOMEM..*/.s
2d6c0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2d6d0 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d  e_nonroot(.  Mem
2d6e0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d700 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73  Parent page of s
2d710 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61  iblings being ba
2d720 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
2d730 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20  iParentIdx,     
2d740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2d750 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67  ndex of "the pag
2d760 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  e" in pParent */
2d770 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63  .  u8 *aOvflSpac
2d780 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2d790 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20     /* page-size 
2d7a0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
2d7b0 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a  or parent ovfl *
2d7c0 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20  /.  int isRoot  
2d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
2d7f0 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74  Parent is a root
2d800 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74  -page */.){.  Bt
2d810 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
2d820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d830 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
2d840 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
2d850 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d860 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d870 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
2d880 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
2d890 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
2d8a0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
2d8b0 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
2d8c0 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
2d8d0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  */.  int nNew = 
2d8e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d8f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2d900 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
2d910 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
2d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d930 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2d940 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
2d950 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
2d960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d970 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2d980 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69  rs */.  int nxDi
2d990 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2d9a0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76       /* Next div
2d9b0 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61  ider slot in pPa
2d9c0 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
2d9d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d9e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2d9f0 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
2da00 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66  de */.  u16 leaf
2da10 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20  Correction;     
2da20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61       /* 4 if pPa
2da30 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
2da40 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74   if not */.  int
2da50 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
2da60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2da70 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  e if pPage is a 
2da80 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41  leaf of a LEAFDA
2da90 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  TA tree */.  int
2daa0 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20   usableSpace;   
2dab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2dac0 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f  es in pPage beyo
2dad0 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  nd the header */
2dae0 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73  .  int pageFlags
2daf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2db00 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67  /* Value of pPag
2db10 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20  e->aData[0] */. 
2db20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20   int subtotal;  
2db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2db40 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74   Subtotal of byt
2db50 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f  es in cells on o
2db60 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ne page */.  int
2db70 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20   iSpace1 = 0;   
2db80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2db90 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
2dba0 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20  f aSpace1[] */. 
2dbb0 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20   int iOvflSpace 
2dbc0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
2dbd0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
2dbe0 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65  te of aOvflSpace
2dbf0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
2dc00 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
2dc10 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2dc20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
2dc30 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
2dc40 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
2dc50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
2dc60 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
2dc70 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
2dc80 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b  MemPage *apCopy[
2dc90 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
2dca0 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f  Private copies o
2dcb0 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20  f apOld[] pages 
2dcc0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
2dcd0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2dce0 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
2dcf0 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73  p to NB siblings
2dd00 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
2dd10 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74   */.  u8 *pRight
2dd20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2dd30 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69     /* Location i
2dd40 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68  n parent of righ
2dd50 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65  t-sibling pointe
2dd60 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  r */.  u8 *apDiv
2dd70 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20  [NB-1];         
2dd80 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
2dd90 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
2dda0 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
2ddb0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2ddc0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
2ddd0 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
2dde0 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
2ddf0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
2de00 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
2de10 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
2de20 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
2de30 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
2de40 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
2de50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2de60 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
2de70 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
2de80 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
2de90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dea0 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
2deb0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
2dec0 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  l[] */.  u8 *aSp
2ded0 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20  ace1;           
2dee0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
2def0 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
2df00 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20  iders cells */. 
2df10 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
2df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2df30 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f   Temp var to sto
2df40 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  re a page number
2df50 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20   in */..  pBt = 
2df60 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20  pParent->pBt;.  
2df70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2df80 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2df90 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2dfa0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2dfb0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
2dfc0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
2dfd0 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28  ..#if 0.  TRACE(
2dfe0 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
2dff0 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
2e000 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
2e010 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
2e020 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  gno));.#endif.. 
2e030 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
2e040 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61  t pParent may ha
2e050 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f  ve at most one o
2e060 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e  verflow cell. An
2e070 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f  d if.  ** this o
2e080 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
2e090 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74  present, it must
2e0a0 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74   be the cell wit
2e0b0 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50  h .  ** index iP
2e0c0 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73  arentIdx. This s
2e0d0 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62  cenario comes ab
2e0e0 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75  out when this fu
2e0f0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63  nction.  ** is c
2e100 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c  alled (indirectl
2e110 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  y) from sqlite3B
2e120 74 72 65 65 44 65 6c 65 74 65 28 29 2e 20 2a 2f  treeDelete(). */
2e130 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2e140 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
2e150 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   || pParent->nOv
2e160 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61  erflow==1 );.  a
2e170 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
2e180 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
2e190 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2e1a0 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64  ].idx==iParentId
2e1b0 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76  x );..  if( !aOv
2e1c0 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72  flSpace ){.    r
2e1d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2e1e0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
2e1f0 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  nd the sibling p
2e200 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e  ages to balance.
2e210 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65   Also locate the
2e220 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
2e230 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76  t .  ** that div
2e240 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ide the siblings
2e250 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20  . An attempt is 
2e260 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
2e270 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a  siblings on .  *
2e280 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  * either side of
2e290 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62   pPage. More sib
2e2a0 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
2e2b0 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
2e2c0 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66  owever, .  ** if
2e2d0 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
2e2e0 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
2e2f0 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
2e300 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a  ide. If pParent.
2e310 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
2e320 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
2e330 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
2e340 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
2e350 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  aken.  .  **.  *
2e360 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
2e370 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64   drops the divid
2e380 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  er cells from th
2e390 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54  e parent page. T
2e3a0 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68  his.  ** way, th
2e3b0 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
2e3c0 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
2e3d0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61   not have to dea
2e3e0 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20  l with any.  ** 
2e3f0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69  overflow cells i
2e400 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
2e410 65 2c 20 61 73 20 69 66 20 6f 6e 65 20 65 78 69  e, as if one exi
2e420 73 74 65 64 20 69 74 20 68 61 73 20 61 6c 72 65  sted it has alre
2e430 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 72 65  ady.  ** been re
2e440 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20 20 69 20 3d  moved.  */.  i =
2e450 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2e460 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e  low + pParent->n
2e470 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20  Cell;.  if( i<2 
2e480 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30  ){.    nxDiv = 0
2e490 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31  ;.    nOld = i+1
2e4a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
2e4b0 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66 28  Old = 3;.    if(
2e4c0 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29   iParentIdx==0 )
2e4d0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
2e4e0 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d    .      nxDiv =
2e4f0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
2e500 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20  ( iParentIdx==i 
2e510 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d  ){.      nxDiv =
2e520 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   i-2;.    }else{
2e530 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69  .      nxDiv = i
2e540 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20  ParentIdx-1;.   
2e550 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20   }.    i = 2;.  
2e560 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76  }.  if( (i+nxDiv
2e570 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
2e580 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  low)==pParent->n
2e590 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67  Cell ){.    pRig
2e5a0 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61  ht = &pParent->a
2e5b0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2e5c0 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65  rOffset+8];.  }e
2e5d0 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20  lse{.    pRight 
2e5e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
2e5f0 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
2e600 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
2e610 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65  .  }.  pgno = ge
2e620 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a  t4byte(pRight);.
2e630 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
2e640 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
2e650 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
2e660 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20   &apOld[i]);.   
2e670 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e680 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30   memset(apOld, 0
2e690 2c 20 69 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  , i*sizeof(MemPa
2e6a0 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge*));.      got
2e6b0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2e6c0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  p;.    }.    nMa
2e6d0 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
2e6e0 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
2e6f0 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
2e700 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d  .    if( (i--)==
2e710 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
2e720 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  if( pParent->nOv
2e730 65 72 66 6c 6f 77 20 26 26 20 69 2b 6e 78 44 69  erflow && i+nxDi
2e740 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  v==pParent->aOvf
2e750 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a 20 20 20 20  l[0].idx ){.    
2e760 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
2e770 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  rent->aOvfl[0].p
2e780 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f  Cell;.      pgno
2e790 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
2e7a0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
2e7b0 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
2e7c0 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
2e7d0 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50  iv[i]);.      pP
2e7e0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2e7f0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
2e800 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
2e810 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
2e820 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
2e830 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
2e840 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
2e850 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
2e860 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
2e870 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2e880 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
2e890 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f  );..      /* Dro
2e8a0 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  p the cell from 
2e8b0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2e8c0 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20   apDiv[i] still 
2e8d0 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  points to.      
2e8e0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  ** the cell with
2e8f0 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65  in the parent, e
2e900 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61  ven though it ha
2e910 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a  s been dropped..
2e920 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
2e930 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72   safe because dr
2e940 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e  opping a cell on
2e950 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ly overwrites th
2e960 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
2e970 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
2e980 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  t, and this func
2e990 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  tion does not ne
2e9a0 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  ed the first.   
2e9b0 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
2e9c0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
2e9d0 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69  cell. So the poi
2e9e0 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20  nter is safe to 
2e9f0 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74  use.      ** lat
2ea00 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a  er on.  .      *
2ea10 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
2ea20 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  s SQLite is comp
2ea30 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64  iled in secure-d
2ea40 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74  elete mode. In t
2ea50 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20  his case,.      
2ea60 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
2ea70 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
2ea80 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
2ea90 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
2eaa0 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
2eab0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
2eac0 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
2ead0 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
2eae0 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
2eaf0 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
2eb00 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
2eb10 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
2eb20 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
2eb30 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
2eb40 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
2eb50 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2eb60 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
2eb70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f        memcpy(&aO
2eb80 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69  vflSpace[apDiv[i
2eb90 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  ]-pParent->aData
2eba0 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e  ], apDiv[i], szN
2ebb0 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 70  ew[i]);.      ap
2ebc0 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
2ebd0 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
2ebe0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 23  arent->aData];.#
2ebf0 65 6e 64 69 66 0a 20 20 20 20 20 20 64 72 6f 70  endif.      drop
2ec00 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
2ec10 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2ec20 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b  Overflow, szNew[
2ec30 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  i]);.    }.  }..
2ec40 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
2ec50 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
2ec60 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
2ec70 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
2ec80 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
2ec90 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
2eca0 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
2ecb0 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
2ecc0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
2ecd0 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
2ece0 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
2ecf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
2ed00 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
2ed10 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
2ed20 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
2ed30 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
2ed40 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
2ed50 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
2ed60 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
2ed70 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
2ed80 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
2ed90 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
2eda0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
2edb0 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edd0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
2ede0 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
2edf0 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
2ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2ee20 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
2ee30 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
2ee40 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
2ee50 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
2ee60 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
2ee70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2ee80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2ee90 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2eea0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
2eeb0 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
2eec0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
2eed0 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
2eee0 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
2eef0 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
2ef00 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2ef10 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
2ef20 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
2ef30 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
2ef40 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
2ef50 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
2ef60 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
2ef70 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
2ef80 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
2ef90 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
2efa0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
2efb0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
2efc0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
2efd0 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
2efe0 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
2eff0 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
2f000 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
2f010 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
2f020 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
2f030 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
2f040 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
2f050 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
2f060 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
2f070 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
2f080 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
2f090 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
2f0a0 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
2f0b0 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
2f0c0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
2f0d0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
2f0e0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
2f0f0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
2f100 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
2f110 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
2f120 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
2f130 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
2f140 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
2f150 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
2f160 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2f170 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
2f180 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
2f190 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
2f1a0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
2f1b0 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
2f1c0 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
2f1d0 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
2f1e0 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
2f1f0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
2f200 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
2f210 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
2f220 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
2f230 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65  n = apOld[0]->le
2f240 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61  af*4;.  leafData
2f250 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73   = apOld[0]->has
2f260 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Data;.  for(i=0;
2f270 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
2f280 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20     int limit;.  
2f290 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65    .    /* Before
2f2a0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
2f2b0 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70  else, take a cop
2f2c0 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72  y of the i'th or
2f2d0 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20  iginal sibling. 
2f2e0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f     ** The rest o
2f2f0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2f300 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
2f310 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
2f320 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74  ther.    ** that
2f330 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
2f340 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
2f350 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
2f360 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20  l be in the.    
2f370 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
2f380 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
2f390 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
2f3a0 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
2f3b0 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
2f3c0 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
2f3d0 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20  eSize + k*i];.  
2f3e0 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61    memcpy(pOld, a
2f3f0 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28  pOld[i], sizeof(
2f400 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70  MemPage));.    p
2f410 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f  Old->aData = (vo
2f420 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20  id*)&pOld[1];.  
2f430 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61    memcpy(pOld->a
2f440 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
2f450 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
2f460 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69  Size);..    limi
2f470 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
2f480 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
2f490 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
2f4a0 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
2f4b0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2f4c0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2f4d0 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
2f4e0 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
2f4f0 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
2f500 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2f510 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
2f520 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
2f530 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65  ell]);.      nCe
2f540 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
2f550 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20  if( i<nOld-1 && 
2f560 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20  !leafData){.    
2f570 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29    u16 sz = (u16)
2f580 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  szNew[i];.      
2f590 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
2f5a0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
2f5b0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2f5c0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
2f5d0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d  = sz;.      pTem
2f5e0 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70  p = &aSpace1[iSp
2f5f0 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70  ace1];.      iSp
2f600 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace1 += sz;.    
2f610 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
2f620 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b  t->pageSize/4 );
2f630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2f640 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67  Space1<=pBt->pag
2f650 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d  eSize );.      m
2f660 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
2f670 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
2f680 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
2f690 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
2f6a0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73  ection;.      as
2f6b0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
2f6c0 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
2f6d0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
2f6e0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
2f6f0 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65  ll] = szCell[nCe
2f700 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63  ll] - leafCorrec
2f710 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
2f720 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
2f730 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2f740 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
2f750 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2f760 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  rt( pOld->hdrOff
2f770 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
2f780 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
2f790 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
2f7a0 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
2f7b0 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
2f7c0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
2f7d0 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
2f7e0 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
2f7f0 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
2f800 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
2f810 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[8], 4);.    
2f820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f830 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
2f840 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
2f850 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2f860 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
2f870 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2f880 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
2f890 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
2f8a0 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
2f8b0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2f8c0 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 4;.        }
2f8d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
2f8e0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
2f8f0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
2f900 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
2f910 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
2f920 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
2f930 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
2f940 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
2f950 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
2f960 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
2f970 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
2f980 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
2f990 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
2f9a0 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
2f9b0 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
2f9c0 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
2f9d0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
2f9e0 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
2f9f0 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
2fa00 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
2fa10 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
2fa20 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
2fa30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
2fa40 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
2fa50 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
2fa60 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
2fa70 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
2fa80 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
2fa90 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
2faa0 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
2fab0 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
2fac0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
2fad0 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
2fae0 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
2faf0 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
2fb00 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
2fb10 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
2fb20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
2fb30 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
2fb40 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
2fb50 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
2fb60 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
2fb70 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
2fb80 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
2fb90 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
2fba0 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
2fbb0 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
2fbc0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2fbd0 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
2fbe0 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
2fbf0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
2fc00 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
2fc10 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
2fc20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
2fc30 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
2fc40 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
2fc50 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
2fc60 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
2fc70 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
2fc80 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
2fc90 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
2fca0 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
2fcb0 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
2fcc0 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69      k++;.      i
2fcd0 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20  f( k>NB+1 ){ rc 
2fce0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2fcf0 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ; goto balance_c
2fd00 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a  leanup; }.    }.
2fd10 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
2fd20 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
2fd30 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
2fd40 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
2fd50 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
2fd60 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
2fd70 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
2fd80 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
2fd90 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
2fda0 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
2fdb0 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
2fdc0 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
2fdd0 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
2fde0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
2fdf0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
2fe00 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
2fe10 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
2fe20 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
2fe30 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
2fe40 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
2fe50 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
2fe60 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
2fe70 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
2fe80 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
2fe90 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
2fea0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
2feb0 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
2fec0 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
2fed0 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
2fee0 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
2fef0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
2ff00 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
2ff10 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
2ff20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
2ff30 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
2ff40 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
2ff50 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
2ff60 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
2ff70 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
2ff80 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
2ff90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
2ffa0 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
2ffb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
2ffc0 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
2ffd0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
2ffe0 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
2fff0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
30000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
30010 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
30020 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
30030 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
30040 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
30050 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
30060 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
30070 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
30080 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
30090 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
300a0 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
300b0 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
300c0 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
300d0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
300e0 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
300f0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
30100 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
30110 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
30120 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
30130 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
30140 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
30150 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
30160 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
30170 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
30180 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
30190 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
301a0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
301b0 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
301c0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
301d0 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
301e0 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
301f0 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
30200 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
30210 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
30220 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
30230 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69  ])>0) or pPage i
30240 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c  s.  ** a virtual
30250 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76   root page.  A v
30260 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
30270 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61   is when the rea
30280 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65  l root.  ** page
30290 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77   is page 1 and w
302a0 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63  e are the only c
302b0 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67  hild of that pag
302c0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
302d0 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
302e0 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
302f0 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
30300 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54  Cell==0) );..  T
30310 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
30320 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22  old: %d %d %d  "
30330 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ,.    apOld[0]->
30340 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  pgno, .    nOld>
30350 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70  =2 ? apOld[1]->p
30360 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c  gno : 0,.    nOl
30370 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d  d>=3 ? apOld[2]-
30380 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a  >pgno : 0.  ));.
30390 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
303a0 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e  ate k new pages.
303b0 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65    Reuse old page
303c0 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  s where possible
303d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f  ..  */.  if( apO
303e0 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29  ld[0]->pgno<=1 )
303f0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
30400 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 67  E_CORRUPT;.    g
30410 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
30420 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46  nup;.  }.  pageF
30430 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  lags = apOld[0]-
30440 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
30450 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
30460 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
30470 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
30480 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
30490 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
304a0 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
304b0 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
304c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
304d0 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
304e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
304f0 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
30500 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
30510 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
30520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
30530 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
30540 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
30550 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
30560 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f  New, &pgno, pgno
30570 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
30580 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
30590 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
305a0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
305b0 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
305c0 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
305d0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
305e0 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  try for the new 
305f0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
30600 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
30610 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
30620 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
30630 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e  t(pBt, pNew->pgn
30640 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
30650 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
30660 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30680 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
30690 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
306a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
306b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
306c0 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
306d0 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
306e0 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
306f0 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
30700 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
30710 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
30720 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
30730 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
30740 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
30750 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
30760 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
30770 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
30780 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
30790 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
307a0 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
307b0 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
307c0 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
307d0 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
307e0 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
307f0 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
30800 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
30810 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
30820 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
30830 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
30840 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
30850 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
30860 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
30870 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
30880 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
30890 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
308a0 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
308b0 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
308c0 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
308d0 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
308e0 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
308f0 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
30900 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
30910 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
30920 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
30930 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
30940 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
30950 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
30960 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
30970 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
30980 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
30990 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
309a0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
309b0 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
309c0 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
309d0 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b   apNew[i]->pgno;
309e0 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20  .    int minI = 
309f0 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  i;.    for(j=i+1
30a00 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<k; j++){.   
30a10 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d     if( apNew[j]-
30a20 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29  >pgno<(unsigned)
30a30 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20  minV ){.        
30a40 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20  minI = j;.      
30a50 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a    minV = apNew[j
30a60 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d  ]->pgno;.      }
30a70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
30a80 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69  inI>i ){.      i
30a90 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50  nt t;.      MemP
30aa0 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74  age *pT;.      t
30ab0 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e   = apNew[i]->pgn
30ac0 6f 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70  o;.      pT = ap
30ad0 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  New[i];.      ap
30ae0 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d  New[i] = apNew[m
30af0 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  inI];.      apNe
30b00 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
30b10 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
30b20 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64  ("new: %d(%d) %d
30b30 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
30b40 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
30b50 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f    apNew[0]->pgno
30b60 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20  , szNew[0],.    
30b70 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b  nNew>=2 ? apNew[
30b80 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  1]->pgno : 0, nN
30b90 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d  ew>=2 ? szNew[1]
30ba0 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
30bb0 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67  3 ? apNew[2]->pg
30bc0 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20  no : 0, nNew>=3 
30bd0 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a  ? szNew[2] : 0,.
30be0 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70      nNew>=4 ? ap
30bf0 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[3]->pgno : 0
30c00 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65  , nNew>=4 ? szNe
30c10 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[3] : 0,.    nN
30c20 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d  ew>=5 ? apNew[4]
30c30 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
30c40 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a  >=5 ? szNew[4] :
30c50 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28   0));..  assert(
30c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
30c70 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
30c80 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
30c90 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74 2c  put4byte(pRight,
30ca0 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e   apNew[nNew-1]->
30cb0 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  pgno);..  /*.  *
30cc0 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
30cd0 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
30ce0 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
30cf0 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
30d00 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
30d10 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
30d20 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
30d30 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
30d40 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
30d50 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
30d60 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
30d70 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
30d80 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
30d90 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
30da0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
30db0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
30dc0 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
30dd0 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20  pageFlags);.    
30de0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
30df0 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20  w, cntNew[i]-j, 
30e00 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43  &apCell[j], &szC
30e10 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73  ell[j]);.    ass
30e20 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c  ert( pNew->nCell
30e30 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26  >0 || (nNew==1 &
30e40 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20  & cntNew[0]==0) 
30e50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
30e60 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  New->nOverflow==
30e70 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e  0 );..    j = cn
30e80 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a  tNew[i];..    /*
30e90 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
30ea0 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
30eb0 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65  bove was not the
30ec0 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
30ed0 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65  ing,.    ** inse
30ee0 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  rt a divider cel
30ef0 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  l into the paren
30f00 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
30f10 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65     assert( i<nNe
30f20 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20  w-1 || j==nCell 
30f30 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65  );.    if( j<nCe
30f40 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  ll ){.      u8 *
30f50 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20  pCell;.      u8 
30f60 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e  *pTemp;.      in
30f70 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73  t sz;..      ass
30f80 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
30f90 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   );.      pCell 
30fa0 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20  = apCell[j];.   
30fb0 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a     sz = szCell[j
30fc0 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] + leafCorrecti
30fd0 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  on;.      pTemp 
30fe0 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f  = &aOvflSpace[iO
30ff0 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20  vflSpace];.     
31000 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
31010 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
31020 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
31030 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
31040 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
31050 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
31060 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65     /* If the tre
31070 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61  e is a leaf-data
31080 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73   tree, and the s
31090 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76  iblings are leav
310a0 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  es, .        ** 
310b0 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
310c0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
310d0 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65   apCell[]. Inste
310e0 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20  ad, the divider 
310f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
31100 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
31110 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   integer key for
31120 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
31130 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20  cell of .       
31140 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d   ** the sibling-
31150 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
31160 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  bove only..     
31170 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65     */.        Ce
31180 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
31190 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
311a0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
311b0 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
311c0 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
311d0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
311e0 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d  mp;.        sz =
311f0 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26   4 + putVarint(&
31200 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e  pCell[4], info.n
31210 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54  Key);.        pT
31220 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  emp = 0;.      }
31230 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
31240 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20  ell -= 4;.      
31250 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73    /* Obscure cas
31260 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64  e for non-leaf-d
31270 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68  ata trees: If th
31280 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20  e cell at pCell 
31290 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  was.        ** p
312a0 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64  reviously stored
312b0 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c   on a leaf node,
312c0 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65   and its reporte
312d0 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20  d size was 4.   
312e0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74       ** bytes, t
312f0 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61  hen it may actua
31300 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  lly be smaller t
31310 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20  han this .      
31320 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50    ** (see btreeP
31330 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34  arseCellPtr(), 4
31340 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69   bytes is the mi
31350 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20  nimum size of.  
31360 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c        ** any cel
31370 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d  l). But it is im
31380 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20  portant to pass 
31390 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65  the correct size
313a0 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   to .        ** 
313b0 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f  insertCell(), so
313c0 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c   reparse the cel
313d0 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  l now..        *
313e0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74  *.        ** Not
313f0 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20  e that this can 
31400 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20  never happen in 
31410 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66  an SQLite data f
31420 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20  ile, as all.    
31430 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65      ** cells are
31440 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
31450 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65  s. It only happe
31460 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73  ns in b-trees us
31470 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ed.        ** to
31480 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53   evaluate "IN (S
31490 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20  ELECT ...)" and 
314a0 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e  similar clauses.
314b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
314c0 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a      if( szCell[j
314d0 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==4 ){.        
314e0 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72    assert(leafCor
314f0 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20  rection==4);.   
31500 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
31510 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
31520 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pCell);.       
31530 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
31540 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73   iOvflSpace += s
31550 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
31560 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69   sz<=pBt->pageSi
31570 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73  ze/4 );.      as
31580 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65  sert( iOvflSpace
31590 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
315a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  );.      rc = in
315b0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
315c0 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
315d0 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d  sz, pTemp, pNew-
315e0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
315f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31600 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
31610 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73  leanup;.      as
31620 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
31630 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
31640 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
31650 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  );..      j++;. 
31660 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
31670 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
31680 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ( j==nCell );.  
31690 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29  assert( nOld>0 )
316a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
316b0 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67  >0 );.  if( (pag
316c0 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41  eFlags & PTF_LEA
316d0 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  F)==0 ){.    u8 
316e0 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70  *zChild = &apCop
316f0 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
31700 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [8];.    memcpy(
31710 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
31720 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64  aData[8], zChild
31730 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 4);.  }..  if(
31740 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65   isRoot && pPare
31750 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  nt->nCell==0 && 
31760 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
31770 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  et<=apNew[0]->nF
31780 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ree ){.    /* Th
31790 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
317a0 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f  he b-tree now co
317b0 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e  ntains no cells.
317c0 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e   The only siblin
317d0 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73  g.    ** page is
317e0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
317f0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20   of the parent. 
31800 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
31810 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
31820 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20  child page into 
31830 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72  the parent, decr
31840 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61  easing the overa
31850 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  ll height of the
31860 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73  .    ** b-tree s
31870 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e  tructure by one.
31880 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62   This is describ
31890 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e  ed as the "balan
318a0 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20  ce-shallower".  
318b0 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74    ** sub-algorit
318c0 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d  hm in some docum
318d0 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a  entation..    **
318e0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
318f0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
31900 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  m database, the 
31910 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65  call to copyNode
31920 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a  Content() .    *
31930 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74  * sets all point
31940 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
31950 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
31960 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70  database image p
31970 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72  ages .    ** for
31980 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74   which the point
31990 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74  er is stored wit
319a0 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hin the content 
319b0 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20  being copied..  
319c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
319d0 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65  second assert be
319e0 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61  low verifies tha
319f0 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  t the child page
31a00 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64   is defragmented
31a10 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74  .    ** (it must
31a20 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a   be, as it was j
31a30 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65  ust reconstructe
31a40 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65  d using assemble
31a50 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20  Page()). This.  
31a60 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e    ** is importan
31a70 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20  t if the parent 
31a80 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
31a90 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  be page 1 of the
31aa0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
31ab0 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20   image.  */.    
31ac0 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20  assert( nNew==1 
31ad0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
31ae0 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d  pNew[0]->nFree =
31af0 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32  = .        (get2
31b00 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e  byte(&apNew[0]->
31b10 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b  aData[5])-apNew[
31b20 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61  0]->cellOffset-a
31b30 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32  pNew[0]->nCell*2
31b40 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ) .    );.    if
31b50 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
31b60 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65   = copyNodeConte
31b70 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61  nt(apNew[0], pPa
31b80 72 65 6e 74 29 29 20 29 7b 0a 20 20 20 20 20 20  rent)) ){.      
31b90 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70  rc = freePage(ap
31ba0 4e 65 77 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20  New[0]);.    }. 
31bb0 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54   }else if( ISAUT
31bc0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f  OVACUUM ){.    /
31bd0 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65  * Fix the pointe
31be0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
31bf0 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20  r all the cells 
31c00 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65  that were shifte
31c10 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a  d around. .    *
31c20 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65  * There are seve
31c30 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79  ral different ty
31c40 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  pes of pointer-m
31c50 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ap entries that 
31c60 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  need to.    ** b
31c70 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
31c80 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f  this routine. So
31c90 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65  me of these have
31ca0 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64   been set alread
31cb0 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61  y, but.    ** ma
31cc0 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65  ny have not. The
31cd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
31ce0 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a  summary:.    **.
31cf0 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20      **   1) The 
31d00 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
31d10 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c  ed with new sibl
31d20 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77  ing pages that w
31d30 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20  ere not.    **  
31d40 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65      siblings whe
31d50 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
31d60 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73  was called. Thes
31d70 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
31d80 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20     **      been 
31d90 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65  set. We don't ne
31da0 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75  ed to worry abou
31db0 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74  t old siblings t
31dc0 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20  hat were.    ** 
31dd0 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68       moved to th
31de0 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68  e free-list - th
31df0 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64  e freePage() cod
31e00 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65  e has taken care
31e10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20  .    **      of 
31e20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  those..    **.  
31e30 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f    **   2) The po
31e40 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
31e50 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
31e60 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  h the first over
31e70 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20  flow.    **     
31e80 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65   page in any ove
31e90 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65  rflow chains use
31ea0 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72  d by new divider
31eb0 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20   cells. These . 
31ec0 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20     **      have 
31ed0 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65  also already bee
31ee0 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20  n taken care of 
31ef0 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
31f00 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  l() code..    **
31f10 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20  .    **   3) If 
31f20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
31f30 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
31f40 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
31f50 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a   pages of.    **
31f60 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72        cells stor
31f70 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e  ed on the siblin
31f80 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64  g pages may need
31f90 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
31fa0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
31fb0 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  4) If the siblin
31fc0 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
31fd0 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
31fe0 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a  nodes, then any.
31ff0 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72      **      over
32000 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20  flow pages used 
32010 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d  by these cells m
32020 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
32030 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dated.    **    
32040 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b    (internal intk
32050 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63  ey nodes never c
32060 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
32070 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
32080 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s)..    **.    *
32090 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69  *   5) If the si
320a0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
320b0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
320c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
320d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74  .    **      ent
320e0 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67  ries for the rig
320f0 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f  ht-child pages o
32100 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d  f each sibling m
32110 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20  ay need.    **  
32120 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65      to be update
32130 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
32140 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61   Cases 1 and 2 a
32150 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62  re dealt with ab
32160 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64  ove by other cod
32170 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  e. The next.    
32180 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  ** block deals w
32190 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20  ith cases 3 and 
321a0 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66  4 and the one af
321b0 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35  ter that, case 5
321c0 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73  . Since.    ** s
321d0 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  etting a pointer
321e0 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20   map entry is a 
321f0 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e  relatively expen
32200 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  sive operation, 
32210 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65  this.    ** code
32220 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74   only sets point
32230 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
32240 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  or child or over
32250 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
32260 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75  have.    ** actu
32270 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65  ally moved betwe
32280 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20  en pages.  */.  
32290 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
322a0 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20  = apNew[0];.    
322b0 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
322c0 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69  apCopy[0];.    i
322d0 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  nt nOverflow = p
322e0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
322f0 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64      int iNextOld
32300 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   = pOld->nCell +
32310 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20   nOverflow;.    
32320 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20  int iOverflow = 
32330 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c  (nOverflow ? pOl
32340 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20  d->aOvfl[0].idx 
32350 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30  : -1);.    j = 0
32360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32380 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73   Current 'old' s
32390 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
323a0 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20     k = 0;       
323b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323c0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
323d0 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70   'new' sibling p
323e0 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  age */.    for(i
323f0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20 26 26 20 72  =0; i<nCell && r
32400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
32410 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  +){.      int is
32420 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20  Divider = 0;.   
32430 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65     while( i==iNe
32440 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  xtOld ){.       
32450 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
32460 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
32470 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
32480 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c   last cell on ol
32490 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  d.        ** sib
324a0 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20  ling page j. If 
324b0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
324c0 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
324d0 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
324e0 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
324f0 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20  then cell i was 
32500 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  a divider cell. 
32510 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20  */.        pOld 
32520 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20  = apCopy[++j];. 
32530 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20         iNextOld 
32540 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
32550 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  + pOld->nCell + 
32560 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
32570 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c  .        if( pOl
32580 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
32590 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66            nOverf
325a0 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
325b0 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  rflow;.         
325c0 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b   iOverflow = i +
325d0 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c   !leafData + pOl
325e0 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b  d->aOvfl[0].idx;
325f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32600 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21     isDivider = !
32610 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20  leafData;  .    
32620 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
32630 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  t(nOverflow>0 ||
32640 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a   iOverflow<i );.
32650 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
32660 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64  erflow<2 || pOld
32670 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
32680 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69  pOld->aOvfl[1].i
32690 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73  dx-1);.      ass
326a0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20  ert(nOverflow<3 
326b0 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  || pOld->aOvfl[1
326c0 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76  ].idx==pOld->aOv
326d0 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20  fl[2].idx-1);.  
326e0 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72      if( i==iOver
326f0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
32700 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20  isDivider = 1;. 
32710 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f         if( (--nO
32720 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20  verflow)>0 ){.  
32730 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
32740 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  w++;.        }. 
32750 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
32760 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29  ( i==cntNew[k] )
32770 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  {.        /* Cel
32780 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20  l i is the cell 
32790 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
327a0 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63  owing the last c
327b0 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20  ell on new.     
327c0 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61     ** sibling pa
327d0 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62  ge k. If the sib
327e0 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
327f0 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20  af pages of an. 
32800 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79         ** intkey
32810 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65   b-tree, then ce
32820 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65  ll i is a divide
32830 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20  r cell.  */.    
32840 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
32850 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  [++k];.        i
32860 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63  f( !leafData ) c
32870 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
32880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
32890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
328a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
328b0 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73  nOld );.      as
328c0 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a  sert( k<nNew );.
328d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
328e0 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e   cell was origin
328f0 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c  ally divider cel
32900 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f  l (and is not no
32910 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  w) or.      ** a
32920 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c  n overflow cell,
32930 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20   or if the cell 
32940 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61  was located on a
32950 20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69   different sibli
32960 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  ng.      ** page
32970 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61   before the bala
32980 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  ncing, then the 
32990 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
329a0 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ies associated. 
329b0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79       ** with any
329c0 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c   child or overfl
329d0 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ow pages need to
329e0 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f   be updated.  */
329f0 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76  .      if( isDiv
32a00 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67  ider || pOld->pg
32a10 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
32a20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c  {.        if( !l
32a30 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b  eafCorrection ){
32a40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32a50 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
32a60 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69  et4byte(apCell[i
32a70 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
32a80 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20  , pNew->pgno);. 
32a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32aa0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70   if( szCell[i]>p
32ab0 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26 26  New->minLocal &&
32ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32ad0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
32ae0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
32af0 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69  r(pNew, apCell[i
32b00 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
32b10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
32b20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63   if( !leafCorrec
32b30 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f  tion ){.      fo
32b40 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
32b50 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65 77 3b 20  E_OK && i<nNew; 
32b60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i++){.        rc
32b70 20 3d 20 70 74 72 6d 61 70 50 75 74 28 0a 09 20   = ptrmapPut(.. 
32b80 20 20 20 70 42 74 2c 20 67 65 74 34 62 79 74 65     pBt, get4byte
32b90 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74  (&apNew[i]->aDat
32ba0 61 5b 38 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  a[8]), PTRMAP_BT
32bb0 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  REE, apNew[i]->p
32bc0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
32bd0 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f    }..#if 0.    /
32be0 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63  * The ptrmapChec
32bf0 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e  kPages() contain
32c00 73 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  s assert() state
32c10 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66  ments that verif
32c20 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c  y that.    ** al
32c30 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  l pointer map pa
32c40 67 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72  ges are set corr
32c50 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68  ectly. This is h
32c60 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20  elpful while .  
32c70 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20    ** debugging. 
32c80 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
32c90 64 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65  disabled because
32ca0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
32cb0 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63  ase may.    ** c
32cc0 61 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29  ause an assert()
32cd0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61   statement to fa
32ce0 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d  il.  */.    ptrm
32cf0 61 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e  apCheckPages(apN
32d00 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70  ew, nNew);.    p
32d10 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
32d20 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65  &pParent, 1);.#e
32d30 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ndif.  }..  asse
32d40 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
32d50 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28  nit );.  TRACE((
32d60 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68  "BALANCE: finish
32d70 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25  ed: old=%d new=%
32d80 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20  d cells=%d\n",. 
32d90 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e           nOld, n
32da0 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20  New, nCell));.. 
32db0 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
32dc0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
32dd0 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
32de0 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
32df0 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70  e3ScratchFree(ap
32e00 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Cell);.  for(i=0
32e10 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
32e20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
32e30 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apOld[i]);.  }. 
32e40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
32e50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
32e60 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d  asePage(apNew[i]
32e70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
32e80 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
32e90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32ea0 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
32eb0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
32ec0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
32ed0 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28  is.** overfull (
32ee0 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  has one or more 
32ef0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e  overflow pages).
32f00 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69  .**.** A new chi
32f10 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63  ld page is alloc
32f20 61 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e  ated and the con
32f30 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72  tents of the cur
32f40 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  rent root.** pag
32f50 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65  e, including ove
32f60 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65  rflow cells, are
32f70 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
32f80 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74   child. The root
32f90 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e  .** page is then
32fa0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20   overwritten to 
32fb0 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79  make it an empty
32fc0 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 72   page with the r
32fd0 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70  ight-child .** p
32fe0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
32ff0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
33000 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
33010 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69  turning, all poi
33020 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
33030 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
33040 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74  o pages .** that
33050 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70   the new child-p
33060 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  age now contains
33070 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65   pointers to are
33080 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a   updated. The.**
33090 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e   entry correspon
330a0 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20  ding to the new 
330b0 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
330c0 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a  ter of the root.
330d0 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  ** page is also 
330e0 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  updated..**.** I
330f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
33100 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f  pChild is set to
33110 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72   contain a refer
33120 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c  ence to the chil
33130 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53  d .** page and S
33140 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
33150 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
33160 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  se the caller is
33170 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
33180 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
33190 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65  () on *ppChild e
331a0 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20  xactly once. If 
331b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
331c0 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
331d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
331e0 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  d *ppChild is se
331f0 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  t to 0..*/.stati
33200 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  c int balance_de
33210 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52  eper(MemPage *pR
33220 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70  oot, MemPage **p
33230 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72  pChild){.  int r
33240 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
33250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
33260 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
33270 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
33280 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
33290 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
332a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
332b0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
332c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
332d0 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
332e0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
332f0 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
33300 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
33310 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52  Shared *pBt = pR
33320 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  oot->pBt;    /* 
33330 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20  The BTree */..  
33340 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e  assert( pRoot->n
33350 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20  Overflow>0 );.  
33360 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
33370 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
33380 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
33390 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20  Make pRoot, the 
333a0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
333b0 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c   b-tree, writabl
333c0 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  e. Allocate a ne
333d0 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61  w .  ** page tha
333e0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
333f0 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c  e new right-chil
33400 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79  d of pPage. Copy
33410 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
33420 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73  ** of the node s
33430 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69  tored on pRoot i
33440 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c  nto the new chil
33450 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  d page..  */.  i
33460 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
33470 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33480 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
33490 50 61 67 65 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Page)).   || SQL
334a0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 61 6c  ITE_OK!=(rc = al
334b0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
334c0 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e  pBt,&pChild,&pgn
334d0 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67  oChild,pRoot->pg
334e0 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c 20 53 51 4c  no,0)).   || SQL
334f0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 63 6f  ITE_OK!=(rc = co
33500 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52  pyNodeContent(pR
33510 6f 6f 74 2c 20 70 43 68 69 6c 64 29 29 0a 20 20  oot, pChild)).  
33520 20 7c 7c 20 28 49 53 41 55 54 4f 56 41 43 55 55   || (ISAUTOVACUU
33530 4d 20 26 26 20 0a 20 20 20 20 20 20 20 53 51 4c  M && .       SQL
33540 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 70 74  ITE_OK!=(rc = pt
33550 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
33560 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42  oChild, PTRMAP_B
33570 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  TREE, pRoot->pgn
33580 6f 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70  o))).  ){.    *p
33590 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20  pChild = 0;.    
335a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
335b0 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ld);.    return 
335c0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
335d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
335e0 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64  writeable(pChild
335f0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
33600 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
33610 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
33620 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
33630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68  );.  assert( pCh
33640 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f  ild->nCell==pRoo
33650 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54  t->nCell );..  T
33660 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
33670 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
33680 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e  o %d\n", pRoot->
33690 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
336a0 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79  no));..  /* Copy
336b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
336c0 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74  lls from pRoot t
336d0 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65  o pChild */.  me
336e0 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76  mcpy(pChild->aOv
336f0 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c  fl, pRoot->aOvfl
33700 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  , pRoot->nOverfl
33710 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d  ow*sizeof(pRoot-
33720 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70  >aOvfl[0]));.  p
33730 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
33740 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66   = pRoot->nOverf
33750 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  low;..  /* Zero 
33760 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
33770 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74  pRoot. Then inst
33780 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68  all pChild as th
33790 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a  e right-child. *
337a0 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  /.  zeroPage(pRo
337b0 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ot, pChild->aDat
337c0 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
337d0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
337e0 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
337f0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
33800 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20   pgnoChild);..  
33810 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c  *ppChild = pChil
33820 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
33830 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
33840 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43  The page that pC
33850 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ur currently poi
33860 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20  nts to has just 
33870 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e  been modified in
33880 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68  .** some way. Th
33890 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75  is function figu
338a0 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20  res out if this 
338b0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61  modification mea
338c0 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e  ns the.** tree n
338d0 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
338e0 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63  ced, and if so c
338f0 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72  alls the appropr
33900 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a  iate balancing .
33910 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61  ** routine. Bala
33920 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  ncing routines a
33930 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61  re:.**.**   bala
33940 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20  nce_quick().**  
33950 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
33960 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e  ).**   balance_n
33970 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74  onroot().*/.stat
33980 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42  ic int balance(B
33990 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
339a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
339b0 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  E_OK;.  const in
339c0 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70  t nMin = pCur->p
339d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a  Bt->usableSize *
339e0 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61   2 / 3;.  u8 aBa
339f0 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
33a00 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65  13];.  u8 *pFree
33a10 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c   = 0;..  TESTONL
33a20 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  Y( int balance_q
33a30 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20  uick_called = 0 
33a40 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  );.  TESTONLY( i
33a50 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
33a60 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a  r_called = 0 );.
33a70 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20  .  do {.    int 
33a80 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
33a90 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  age;.    MemPage
33aa0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
33ab0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a  apPage[iPage];..
33ac0 20 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30      if( iPage==0
33ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
33ae0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
33af0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
33b00 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
33b10 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72  e b-tree is over
33b20 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61  full. In this ca
33b30 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20  se call the.    
33b40 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64      ** balance_d
33b50 65 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  eeper() function
33b60 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
33b70 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72   child for the r
33b80 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
33b90 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65   ** and copy the
33ba0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
33bb0 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  s of the root-pa
33bc0 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20  ge to it. The.  
33bd0 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74        ** next it
33be0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
33bf0 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
33c00 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61  nce the child pa
33c10 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a  ge..        */ .
33c20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33c30 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f  (balance_deeper_
33c40 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a  called++)==0 );.
33c50 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
33c60 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67  ance_deeper(pPag
33c70 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  e, &pCur->apPage
33c80 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
33c90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ){.          pCu
33cb0 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20  r->iPage = 1;.  
33cc0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
33cd0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[0] = 0;.    
33ce0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
33cf0 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x[1] = 0;.      
33d00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
33d10 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76  ->apPage[1]->nOv
33d20 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20  erflow );.      
33d30 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
33d40 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
33d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
33d60 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76  e if( pPage->nOv
33d70 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61  erflow==0 && pPa
33d80 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20  ge->nFree<=nMin 
33d90 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
33da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33db0 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74   MemPage * const
33dc0 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d   pParent = pCur-
33dd0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d  >apPage[iPage-1]
33de0 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  ;.      int cons
33df0 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61  t iIdx = pCur->a
33e00 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a  iIdx[iPage-1];..
33e10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33e20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
33e30 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
33e40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33e50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64  LITE_OK ){.#ifnd
33e60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
33e70 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20  UICKBALANCE.    
33e80 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
33e90 61 73 44 61 74 61 0a 20 20 20 20 20 20 20 20 20  asData.         
33ea0 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
33eb0 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  low==1.         
33ec0 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  && pPage->aOvfl[
33ed0 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
33ee0 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26  Cell.         &&
33ef0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d   pParent->pgno!=
33f00 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  1.         && pP
33f10 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49  arent->nCell==iI
33f20 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  dx.        ){.  
33f30 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20          /* Call 
33f40 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
33f50 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
33f60 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65  sibling of pPage
33f70 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   on which.      
33f80 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20      ** to store 
33f90 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
33fa0 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  l. balance_quick
33fb0 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77  () inserts a new
33fc0 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   cell.          
33fd0 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c  ** into pParent,
33fe0 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65   which may cause
33ff0 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f   pParent overflo
34000 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20  w. If this.     
34010 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c       ** happens,
34020 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61   the next intera
34030 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
34040 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65  oop will balance
34050 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20   pParent .      
34060 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65      ** use eithe
34070 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  r balance_nonroo
34080 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64  t() or balance_d
34090 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74  eeper(). Until t
340a0 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
340b0 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76   happens, the ov
340c0 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73  erflow cell is s
340d0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61  tored in the aBa
340e0 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
340f0 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  ].          ** b
34100 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20  uffer. .        
34110 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
34120 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66  * The purpose of
34130 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
34140 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68  ssert() is to ch
34150 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a  eck that only a.
34160 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
34170 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  gle call to bala
34180 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d  nce_quick() is m
34190 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c  ade for each cal
341a0 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
341b0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
341c0 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f   If this were no
341d0 74 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75  t verified, a su
341e0 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69  btle bug involvi
341f0 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20  ng reuse.       
34200 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61     ** of the aBa
34210 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
34220 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e  ] might sneak in
34230 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
34240 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
34250 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f   (balance_quick_
34260 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a  called++)==0 );.
34270 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
34280 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61  alance_quick(pPa
34290 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61  rent, pPage, aBa
342a0 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29  lanceQuickSpace)
342b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
342c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
342d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
342e0 20 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c   this case, call
342f0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34300 28 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75  () to redistribu
34310 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20  te cells.       
34320 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50     ** between pP
34330 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20  age and up to 2 
34340 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70  of its sibling p
34350 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c  ages. This invol
34360 76 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ves.          **
34370 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
34380 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65  ontents of pPare
34390 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
343a0 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20  use pParent to. 
343b0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f           ** beco
343c0 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
343d0 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65  nderfull. The ne
343e0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
343f0 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20  the do-loop.    
34400 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61        ** will ba
34410 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
34420 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74   page to correct
34430 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20   this..         
34440 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a   ** .          *
34450 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20  * If the parent 
34460 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
34470 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66  rfull, the overf
34480 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c  low cell or cell
34490 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
344a0 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
344b0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61   pSpace buffer a
344c0 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61  llocated immedia
344d0 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20  tely below. .   
344e0 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73         ** A subs
344f0 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e  equent iteration
34500 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
34510 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74  will deal with t
34520 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20  his by.         
34530 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61   ** calling bala
34540 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62  nce_nonroot() (b
34550 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
34560 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69  may be called fi
34570 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a  rst,.          *
34580 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74  * but it doesn't
34590 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66   deal with overf
345a0 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74  low cells - just
345b0 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61   moves them to a
345c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
345d0 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f  fferent page). O
345e0 6e 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75  nce this subsequ
345f0 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ent call to bala
34600 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20  nce_nonroot() . 
34610 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
34620 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73  completed, it is
34630 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65   safe to release
34640 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
34650 65 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20  er used by.     
34660 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76       ** the prev
34670 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68  ious call, as th
34680 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
34690 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62  data will have b
346a0 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  een .          *
346b0 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20  * copied either 
346c0 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
346d0 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
346e0 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   or into the new
346f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53  .          ** pS
34700 70 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73  pace buffer pass
34710 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72  ed to the latter
34720 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
34730 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20  _nonroot()..    
34740 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34750 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
34760 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
34770 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67  c(pCur->pBt->pag
34780 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
34790 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
347a0 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20  onroot(pParent, 
347b0 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50  iIdx, pSpace, iP
347c0 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20  age==1);.       
347d0 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a     if( pFree ){.
347e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
347f0 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e  f pFree is not N
34800 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74  ULL, it points t
34810 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
34820 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20  fer used .      
34830 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72        ** by a pr
34840 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62  evious call to b
34850 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
34860 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61  . Its contents a
34870 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
34880 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74  * now stored eit
34890 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61  her on real data
348a0 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69  base pages or wi
348b0 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  thin the .      
348c0 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70        ** new pSp
348d0 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69  ace buffer, so i
348e0 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20  t may be safely 
348f0 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20  freed here. */. 
34900 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
34910 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
34920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  );.          }..
34930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
34940 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77   pSpace buffer w
34950 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74  ill be freed aft
34960 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  er the next call
34970 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
34980 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34990 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f  (), or just befo
349a0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
349b0 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65   returns, whiche
349c0 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ver.          **
349d0 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f   comes first. */
349e0 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65  .          pFree
349f0 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20   = pSpace;.     
34a00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
34a10 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
34a20 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20  flow = 0;..     
34a30 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65   /* The next ite
34a40 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
34a50 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74  -loop balances t
34a60 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
34a70 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
34a80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
34a90 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d     pCur->iPage--
34aa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
34ab0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34ac0 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20  );..  if( pFree 
34ad0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
34ae0 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  geFree(pFree);. 
34af0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
34b00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  }.../*.** Insert
34b10 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
34b20 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54  to the BTree.  T
34b30 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20  he key is given 
34b40 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a  by (pKey,nKey).*
34b50 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69  * and the data i
34b60 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74  s given by (pDat
34b70 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63  a,nData).  The c
34b80 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e  ursor is used on
34b90 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20  ly to.** define 
34ba0 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72  what table the r
34bb0 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
34bc0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20  inserted into.  
34bd0 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
34be0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
34bf0 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74  t a random locat
34c00 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ion..**.** For a
34c10 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20  n INTKEY table, 
34c20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61  only the nKey va
34c30 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69  lue of the key i
34c40 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
34c50 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
34c60 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62  r a ZERODATA tab
34c70 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e  le, the pData an
34c80 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68  d nData are both
34c90 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
34ca0 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
34cb0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
34cc0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
34cd0 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20  successful call 
34ce0 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61  to.** MovetoUnpa
34cf0 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63  cked() to seek c
34d00 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70  ursor pCur to (p
34d10 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61  Key, nKey) has a
34d20 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
34d30 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65  erformed. seekRe
34d40 73 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72  sult is the sear
34d50 63 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e  ch result return
34d60 65 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a  ed (a negative.*
34d70 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72  * number if pCur
34d80 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e   points at an en
34d90 74 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c  try that is smal
34da0 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20  ler than (pKey, 
34db0 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70  nKey), or.** a p
34dc0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
34dd0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
34de0 61 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20  an etry that is 
34df0 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20  larger than .** 
34e00 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a  (pKey, nKey)). .
34e10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65  **.** If the see
34e20 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65  kResult paramete
34e30 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72  r is 0, then cur
34e40 73 6f 72 20 70 43 75 72 20 6d 61 79 20 70 6f 69  sor pCur may poi
34e50 6e 74 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e  nt to any .** en
34e60 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74  try or to no ent
34e70 72 79 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68  ry at all. In th
34e80 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e  is case this fun
34e90 63 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65  ction has to see
34ea0 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  k.** the cursor 
34eb0 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b  before the new k
34ec0 65 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74  ey can be insert
34ed0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
34ee0 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20  e3BtreeInsert(. 
34ef0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
34f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f10 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
34f20 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66  nto the table of
34f30 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
34f40 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
34f50 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
34f60 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74   /* The key of t
34f70 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
34f80 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
34f90 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c  Data, int nData,
34fa0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66    /* The data of
34fb0 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
34fc0 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
34fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fe0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
34ff0 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74   extra 0 bytes t
35000 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61  o append to data
35010 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
35020 42 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  Bias,           
35030 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
35040 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61  this is likely a
35050 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e  n append */.  in
35060 74 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20  t seekResult    
35070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35080 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20  Result of prior 
35090 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
350a0 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   call */.){.  in
350b0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20  t rc;.  int loc 
350c0 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20  = seekResult;.  
350d0 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74  int szNew;.  int
350e0 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
350f0 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20  *pPage;.  Btree 
35100 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
35110 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
35120 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
35130 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c  nsigned char *ol
35140 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65  dCell;.  unsigne
35150 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20  d char *newCell 
35160 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
35170 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
35180 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
35190 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
351a0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
351b0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
351c0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
351d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
351e0 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 61  r->wrFlag );.  a
351f0 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
35200 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
35210 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
35220 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  , pCur->pKeyInfo
35230 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a  !=0, 2) );..  /*
35240 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
35250 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62  nsert into a tab
35260 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c  le b-tree, inval
35270 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c  idate any incrbl
35280 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73  ob .  ** cursors
35290 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77   open on the row
352a0 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
352b0 28 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69  (assuming this i
352c0 73 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  s a replace.  **
352d0 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20   operation - if 
352e0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66  it is not, the f
352f0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f  ollowing is a no
35300 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  -op).  */.  if( 
35310 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
35320 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  0 ){.    invalid
35330 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
35340 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  rs(p, pCur->pgno
35350 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a  Root, nKey, 0);.
35360 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
35370 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
35380 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
35390 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
353a0 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
353b0 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
353c0 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
353d0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
353e0 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
353f0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
35400 68 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  he call to btree
35410 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69  Moveto() below i
35420 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20  s a no-op. For. 
35430 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65   ** example, whe
35440 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61  n inserting data
35450 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69   into a table wi
35460 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  th auto-generate
35470 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b  d integer.  ** k
35480 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61  eys, the VDBE la
35490 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69  yer invokes sqli
354a0 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74  te3BtreeLast() t
354b0 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
354c0 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b   .  ** integer k
354d0 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68  ey to use. It th
354e0 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  en calls this fu
354f0 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c  nction to actual
35500 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20  ly insert the . 
35510 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68   ** data into th
35520 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e  e intkey B-Tree.
35530 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 74   In this case bt
35540 72 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f  reeMoveto() reco
35550 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74  gnizes.  ** that
35560 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
35570 6c 72 65 61 64 79 20 77 68 65 72 65 20 69 74 20  lready where it 
35580 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20  needs to be and 
35590 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a  returns without.
355a0 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77    ** doing any w
355b0 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68  ork. To avoid th
355c0 77 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70  warting these op
355d0 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20  timizations, it 
355e0 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a  is important.  *
355f0 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74  * not to clear t
35600 68 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a  he cursor here..
35610 20 20 2a 2f 0a 20 20 69 66 28 0a 20 20 20 20 53    */.  if(.    S
35620 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
35630 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
35640 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
35650 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 20 28 21  ot, pCur)) || (!
35660 6c 6f 63 20 26 26 0a 20 20 20 20 53 51 4c 49 54  loc &&.    SQLIT
35670 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
35680 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b  eMoveto(pCur, pK
35690 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64  ey, nKey, append
356a0 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29  Bias, &loc)).  )
356b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
356c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
356d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
356e0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
356f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
35700 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c  SOR_INVALID && l
35710 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20  oc) );..  pPage 
35720 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
35730 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
35740 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
35750 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
35760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35770 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
35780 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20  ge->intKey );.. 
35790 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
357a0 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
357b0 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
357c0 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
357d0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
357e0 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
357f0 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
35800 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
35810 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
35820 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
35830 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
35840 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
35850 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
35860 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
35870 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
35880 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
35890 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
358a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
358b0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
358c0 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
358d0 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
358e0 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
358f0 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
35900 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
35910 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
35920 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
35930 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
35940 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
35950 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
35960 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70  Bt) );.  idx = p
35970 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
35980 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c  >iPage];.  if( l
35990 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36  oc==0 ){.    u16
359a0 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65   szOld;.    asse
359b0 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e  rt( idx<pPage->n
359c0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
359d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
359e0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
359f0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
35a00 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
35a10 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
35a20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
35a30 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
35a40 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
35a50 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
35a60 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
35a70 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
35a80 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
35a90 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
35aa0 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
35ab0 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
35ac0 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
35ad0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
35ae0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
35af0 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c     rc = dropCell
35b00 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f  (pPage, idx, szO
35b10 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ld);.    if( rc!
35b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20  =SQLITE_OK ) {. 
35b30 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
35b40 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  sert;.    }.  }e
35b50 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
35b60 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
35b70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
35b80 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
35b90 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
35ba0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
35bb0 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e];.  }else{.   
35bc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
35bd0 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
35be0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
35bf0 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c  age, idx, newCel
35c00 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
35c10 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
35c20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
35c30 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50  e->nCell>0 || pP
35c40 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
35c50 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20   );..  /* If no 
35c60 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
35c70 64 20 61 6e 64 20 70 50 61 67 65 20 68 61 73 20  d and pPage has 
35c80 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  an overflow cell
35c90 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29  , call balance()
35ca0 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74   .  ** to redist
35cb0 72 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73  ribute the cells
35cc0 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 65 65   within the tree
35cd0 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28  . Since balance(
35ce0 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20  ) may move.  ** 
35cf0 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f  the cursor, zero
35d00 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e   the BtCursor.in
35d10 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43  fo.nSize and BtC
35d20 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a  ursor.validNKey.
35d30 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a    ** variables..
35d40 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f    **.  ** Previo
35d50 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  us versions of S
35d60 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76  QLite called mov
35d70 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76  eToRoot() to mov
35d80 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a  e the cursor.  *
35d90 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f  * back to the ro
35da0 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e  ot page as balan
35db0 63 65 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76  ce() used to inv
35dc0 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74  alidate the cont
35dd0 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43  ents.  ** of BtC
35de0 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61  ursor.apPage[] a
35df0 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  nd BtCursor.aiId
35e00 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  x[]. Instead of 
35e10 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a  doing that,.  **
35e20 20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20   set the cursor 
35e30 73 74 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69  state to "invali
35e40 64 22 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63  d". This makes c
35e50 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65  ommon insert ope
35e60 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69  rations.  ** sli
35e70 67 68 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20  ghtly faster..  
35e80 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73  **.  ** There is
35e90 20 61 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d   a subtle but im
35ea0 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61  portant optimiza
35eb0 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57  tion here too. W
35ec0 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20  hen inserting.  
35ed0 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f  ** multiple reco
35ee0 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b  rds into an intk
35ef0 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20  ey b-tree using 
35f00 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20  a single cursor 
35f10 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70  (as can.  ** hap
35f20 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73  pen while proces
35f30 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20  sing an "INSERT 
35f40 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22  INTO ... SELECT"
35f50 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a   statement), it.
35f60 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67    ** is advantag
35f70 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68  eous to leave th
35f80 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
35f90 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
35fa0 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  try in.  ** the 
35fb0 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73 69 62  b-tree if possib
35fc0 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f  le. If the curso
35fd0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
35fe0 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20  ng to the last. 
35ff0 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65   ** entry in the
36000 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20   table, and the 
36010 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65  next row inserte
36020 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72  d has an integer
36030 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72   key.  ** larger
36040 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
36050 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20  t existing key, 
36060 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
36070 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a  o insert the.  *
36080 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65  * row without se
36090 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  eking the cursor
360a0 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 61 20  . This can be a 
360b0 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  big performance 
360c0 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43  boost..  */.  pC
360d0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
360e0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
360f0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
36100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
36110 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
36120 6f 77 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  ow ){.    rc = b
36130 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20  alance(pCur);.. 
36140 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20     /* Must make 
36150 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69  sure nOverflow i
36160 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20  s reset to zero 
36170 65 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61  even if the bala
36180 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69  nce().    ** fai
36190 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74  ls. Internal dat
361a0 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  a structure corr
361b0 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  uption will resu
361c0 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20  lt otherwise. . 
361d0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20     ** Also, set 
361e0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
361f0 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69   to invalid. Thi
36200 73 20 73 74 6f 70 73 20 73 61 76 65 43 75 72 73  s stops saveCurs
36210 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20  orPosition().   
36220 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
36230 74 6f 20 73 61 76 65 20 74 68 65 20 63 75 72 72  to save the curr
36240 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
36250 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a  the cursor.  */.
36260 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
36270 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
36280 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
36290 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
362a0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
362b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
362c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
362d0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66  ->iPage]->nOverf
362e0 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69  low==0 );..end_i
362f0 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20  nsert:.  return 
36300 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
36310 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68  ete the entry th
36320 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
36330 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
36340 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
36350 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
36360 20 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63   a arbitrary loc
36370 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
36380 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
36390 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
363a0 7b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  {.  Btree *p = p
363b0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
363c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
363d0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
363e0 20 20 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20      .  int rc;  
363f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
36410 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
36420 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
36430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36440 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
36450 64 65 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d  delete cell from
36460 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
36470 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20  har *pCell;     
36480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
36490 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f  inter to cell to
364a0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
364b0 20 69 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20   iCellIdx;      
364c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364d0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65    /* Index of ce
364e0 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ll to delete */.
364f0 20 20 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68    int iCellDepth
36500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36510 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20         /* Depth 
36520 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69  of node containi
36530 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20  ng pCell */ ..  
36540 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
36550 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
36560 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
36570 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
36580 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
36590 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
365a0 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73  eadOnly );.  ass
365b0 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61  ert( pCur->wrFla
365c0 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  g );.  assert( h
365d0 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
365e0 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e  leLock(p, pCur->
365f0 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e  pgnoRoot, pCur->
36600 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20  pKeyInfo!=0, 2) 
36610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 68 61  );.  assert( !ha
36620 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
36630 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
36640 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ) );..  if( NEVE
36650 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  R(pCur->aiIdx[pC
36660 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72  ur->iPage]>=pCur
36670 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
36680 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20  Page]->nCell) . 
36690 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d    || NEVER(pCur-
366a0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
366b0 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20  VALID).  ){.    
366c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
366d0 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ROR;  /* Somethi
366e0 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79  ng has gone awry
366f0 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  . */.  }..  /* I
36700 66 20 74 68 69 73 20 69 73 20 61 20 64 65 6c 65  f this is a dele
36710 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  te operation to 
36720 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f  remove a row fro
36730 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  m a table b-tree
36740 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74  ,.  ** invalidat
36750 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
36760 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
36770 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c  he row being del
36780 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20  eted.  */.  if( 
36790 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
367a0 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  0 ){.    invalid
367b0 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
367c0 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  rs(p, pCur->pgno
367d0 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f  Root, pCur->info
367e0 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a  .nKey, 0);.  }..
367f0 20 20 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70    iCellDepth = p
36800 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43  Cur->iPage;.  iC
36810 65 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61  ellIdx = pCur->a
36820 69 49 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d  iIdx[iCellDepth]
36830 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
36840 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65  ->apPage[iCellDe
36850 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  pth];.  pCell = 
36860 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
36870 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a  iCellIdx);..  /*
36880 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   If the page con
36890 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72  taining the entr
368a0 79 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e  y to delete is n
368b0 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  ot a leaf page, 
368c0 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75  move.  ** the cu
368d0 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67  rsor to the larg
368e0 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  est entry in the
368f0 20 74 72 65 65 20 74 68 61 74 20 69 73 20 73 6d   tree that is sm
36900 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  aller than.  ** 
36910 74 68 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20  the entry being 
36920 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65  deleted. This ce
36930 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20  ll will replace 
36940 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64  the cell being d
36950 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d  eleted.  ** from
36960 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
36970 64 65 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75  de. The 'previou
36980 73 27 20 65 6e 74 72 79 20 69 73 20 75 73 65 64  s' entry is used
36990 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61   for this instea
369a0 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e  d.  ** of the 'n
369b0 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74  ext' entry, as t
369c0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
369d0 79 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 61  y is always a pa
369e0 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  rt of the.  ** s
369f0 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 20 62  ub-tree headed b
36a00 79 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  y the child page
36a10 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69   of the cell bei
36a20 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73  ng deleted. This
36a30 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61   makes.  ** bala
36a40 6e 63 69 6e 67 20 74 68 65 20 74 72 65 65 20 66  ncing the tree f
36a50 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c  ollowing the del
36a60 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61  ete operation ea
36a70 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20  sier.  */.  if( 
36a80 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
36a90 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b      int notUsed;
36aa0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
36ab0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
36ac0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
36ad0 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 29 20  Cur, &notUsed)) 
36ae0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
36af0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
36b00 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
36b10 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
36b20 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
36b30 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62   on this table b
36b40 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e  efore.  ** makin
36b50 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  g any modificati
36b60 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  ons. Make the pa
36b70 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
36b80 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20  e entry to be . 
36b90 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74   ** deleted writ
36ba0 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20  able. Then free 
36bb0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
36bc0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
36bd0 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74  th the .  ** ent
36be0 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72  ry and finally r
36bf0 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 69  emove the cell i
36c00 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74 68 69  tself from withi
36c10 6e 20 74 68 65 20 70 61 67 65 2e 20 20 0a 20 20  n the page.  .  
36c20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  */.  rc = saveAl
36c30 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
36c40 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
36c50 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
36c60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
36c70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36c80 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
36c90 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
36ca0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
36cb0 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
36cc0 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28  e, pCell);.  if(
36cd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
36ce0 0a 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c  .  rc = dropCell
36cf0 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78  (pPage, iCellIdx
36d00 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
36d10 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
36d20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
36d30 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  rc;..  /* If the
36d40 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77 61   cell deleted wa
36d50 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f 6e  s not located on
36d60 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
36d70 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20  en the cursor.  
36d80 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
36d90 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
36da0 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e  largest entry in
36db0 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65   the sub-tree he
36dc0 61 64 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  aded.  ** by the
36dd0 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20 74   child-page of t
36de0 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61 73  he cell that was
36df0 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66 72   just deleted fr
36e00 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20  om an internal. 
36e10 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63 65   ** node. The ce
36e20 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66  ll from the leaf
36e30 20 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f 20 62   node needs to b
36e40 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 69  e moved to the i
36e50 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64  nternal.  ** nod
36e60 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
36e70 20 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e 20 20   deleted cell.  
36e80 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  */.  if( !pPage-
36e90 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d 65 6d  >leaf ){.    Mem
36ea0 50 61 67 65 20 2a 70 4c 65 61 66 20 3d 20 70 43  Page *pLeaf = pC
36eb0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
36ec0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74  >iPage];.    int
36ed0 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67 6e 6f   nCell;.    Pgno
36ee0 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67   n = pCur->apPag
36ef0 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31 5d 2d  e[iCellDepth+1]-
36f00 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73 69 67  >pgno;.    unsig
36f10 6e 65 64 20 63 68 61 72 20 2a 70 54 6d 70 3b 0a  ned char *pTmp;.
36f20 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
36f30 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65  dCell(pLeaf, pLe
36f40 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  af->nCell-1);.  
36f50 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69    nCell = cellSi
36f60 7a 65 50 74 72 28 70 4c 65 61 66 2c 20 70 43 65  zePtr(pLeaf, pCe
36f70 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ll);.    assert(
36f80 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
36f90 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  t)>=nCell );..  
36fa0 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
36fb0 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 70 54  ace(pBt);.    pT
36fc0 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  mp = pBt->pTmpSp
36fd0 61 63 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ace;..    rc = s
36fe0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36ff0 28 70 4c 65 61 66 2d 3e 70 44 62 50 61 67 65 29  (pLeaf->pDbPage)
37000 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
37010 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
37020 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
37030 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 70  age, iCellIdx, p
37040 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c 6c 2b 34 2c  Cell-4, nCell+4,
37050 20 70 54 6d 70 2c 20 6e 29 3b 0a 20 20 20 20 69   pTmp, n);.    i
37060 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37070 63 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70  c;.    rc = drop
37080 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61  Cell(pLeaf, pLea
37090 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c  f->nCell-1, nCel
370a0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
370b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
370c0 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20 74 68  .  /* Balance th
370d0 65 20 74 72 65 65 2e 20 49 66 20 74 68 65 20 65  e tree. If the e
370e0 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77 61 73  ntry deleted was
370f0 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65   located on a le
37100 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20 74 68  af page,.  ** th
37110 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  en the cursor st
37120 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ill points to th
37130 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68 69 73  at page. In this
37140 20 63 61 73 65 20 74 68 65 20 66 69 72 73 74 0a   case the first.
37150 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 61 6c    ** call to bal
37160 61 6e 63 65 28 29 20 72 65 70 61 69 72 73 20 74  ance() repairs t
37170 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65  he tree, and the
37180 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69 74 69   if(...) conditi
37190 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76 65 72  on is.  ** never
371a0 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   true..  **.  **
371b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
371c0 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64  he entry deleted
371d0 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74 65 72   was on an inter
371e0 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c 20 74  nal node page, t
371f0 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20 69 73  hen.  ** pCur is
37200 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
37210 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
37220 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77 61 73  which a cell was
37230 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a   removed to.  **
37240 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c   replace the cel
37250 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  l deleted from t
37260 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
37270 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74  . This is slight
37280 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79 20 61  ly.  ** tricky a
37290 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  s the leaf node 
372a0 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75 6c 6c  may be underfull
372b0 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65 72 6e  , and the intern
372c0 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20 2a 2a  al node may.  **
372d0 20 62 65 20 65 69 74 68 65 72 20 75 6e 64 65 72   be either under
372e0 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e   or overfull. In
372f0 20 74 68 69 73 20 63 61 73 65 20 72 75 6e 20 74   this case run t
37300 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61 6c 67  he balancing alg
37310 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e 20 74  orithm.  ** on t
37320 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66 69 72  he leaf node fir
37330 73 74 2e 20 49 66 20 74 68 65 20 62 61 6c 61 6e  st. If the balan
37340 63 65 20 70 72 6f 63 65 65 64 73 20 66 61 72 20  ce proceeds far 
37350 65 6e 6f 75 67 68 20 75 70 20 74 68 65 0a 20 20  enough up the.  
37360 2a 2a 20 74 72 65 65 20 74 68 61 74 20 77 65 20  ** tree that we 
37370 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61 74  can be sure that
37380 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69 6e 20   any problem in 
37390 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
373a0 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20  e has.  ** been 
373b0 63 6f 72 72 65 63 74 65 64 2c 20 73 6f 20 62 65  corrected, so be
373c0 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   it. Otherwise, 
373d0 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
373e0 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c 0a 20  the leaf node,. 
373f0 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63 75 72   ** walk the cur
37400 73 6f 72 20 75 70 20 74 68 65 20 74 72 65 65 20  sor up the tree 
37410 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
37420 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e 63 65  node and balance
37430 20 69 74 20 61 73 20 0a 20 20 2a 2a 20 77 65 6c   it as .  ** wel
37440 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 62 61  l.  */.  rc = ba
37450 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 69  lance(pCur);.  i
37460 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37470 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
37480 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20 20  iCellDepth ){.  
37490 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
374a0 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68 20  Page>iCellDepth 
374b0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
374c0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
374d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d  e[pCur->iPage--]
374e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
374f0 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b  = balance(pCur);
37500 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
37510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37520 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
37530 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
37540 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
37550 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20  ate a new BTree 
37560 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e  table.  Write in
37570 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20  to *piTable the 
37580 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
37590 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
375a0 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
375b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70  e..**.** The typ
375c0 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74  e of type is det
375d0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66  ermined by the f
375e0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20  lags parameter. 
375f0 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c   Only the.** fol
37600 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66  lowing values of
37610 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65   flags are curre
37620 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74  ntly in use.  Ot
37630 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  her values for.*
37640 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f  * flags might no
37650 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20  t work:.**.**   
37660 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42    BTREE_INTKEY|B
37670 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20  TREE_LEAFDATA   
37680 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74    Used for SQL t
37690 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64  ables with rowid
376a0 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52   keys.**     BTR
376b0 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20  EE_ZERODATA     
376c0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
376d0 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65  d for SQL indice
376e0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
376f0 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
37700 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
37710 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
37720 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  gs){.  BtShared 
37730 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
37740 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
37750 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
37760 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
37770 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
37780 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
37790 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
377a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
377b0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
377c0 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
377d0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69  >readOnly );..#i
377e0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
377f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63  _AUTOVACUUM.  rc
37800 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
37810 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
37820 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
37830 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
37840 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
37850 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70   }.#else.  if( p
37860 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
37870 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d  {.    Pgno pgnoM
37880 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76  ove;      /* Mov
37890 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f  e a page here to
378a0 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
378b0 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a  he root-page */.
378c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
378d0 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70  geMove; /* The p
378e0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20  age to move to. 
378f0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  */..    /* Creat
37900 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
37910 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71  may probably req
37920 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65  uire moving an e
37930 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
37940 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20  .    ** to make 
37950 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77  room for the new
37960 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67   tables root pag
37970 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73 20  e. In case this 
37980 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a  page turns.    *
37990 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f  * out to be an o
379a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65  verflow page, de
379b0 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f  lete all overflo
379c0 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65  w page-map cache
379d0 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79  s.    ** held by
379e0 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20   open cursors.. 
379f0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69     */.    invali
37a00 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
37a10 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20  ache(pBt);..    
37a20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75  /* Read the valu
37a30 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f  e of meta[3] fro
37a40 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  m the database t
37a50 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72  o determine wher
37a60 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  e the.    ** roo
37a70 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
37a80 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67  w table should g
37a90 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68  o. meta[3] is th
37aa0 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
37ab0 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  age.    ** creat
37ac0 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68  ed so far, so th
37ad0 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
37ae0 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a  is (meta[3]+1)..
37af0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
37b00 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
37b10 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f  , BTREE_LARGEST_
37b20 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67 6e 6f  ROOT_PAGE, &pgno
37b30 52 6f 6f 74 29 3b 0a 20 20 20 20 70 67 6e 6f 52  Root);.    pgnoR
37b40 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54  oot++;..    /* T
37b50 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
37b60 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f   may not be allo
37b70 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74  cated on a point
37b80 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20  er-map page, or 
37b90 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49  the.    ** PENDI
37ba0 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20  NG_BYTE page..  
37bb0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
37bc0 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50  pgnoRoot==PTRMAP
37bd0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e  _PAGENO(pBt, pgn
37be0 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20  oRoot) ||.      
37bf0 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44    pgnoRoot==PEND
37c00 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
37c10 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  t) ){.      pgno
37c20 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Root++;.    }.  
37c30 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f    assert( pgnoRo
37c40 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a  ot>=3 );..    /*
37c50 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65   Allocate a page
37c60 2e 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  . The page that 
37c70 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65  currently reside
37c80 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69  s at pgnoRoot wi
37c90 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76  ll.    ** be mov
37ca0 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  ed to the alloca
37cb0 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73  ted page (unless
37cc0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
37cd0 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20  age happens.    
37ce0 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20  ** to reside at 
37cf0 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a  pgnoRoot)..    *
37d00 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  /.    rc = alloc
37d10 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
37d20 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70  , &pPageMove, &p
37d30 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f  gnoMove, pgnoRoo
37d40 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 1);.    if( r
37d50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37d60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37d70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
37d80 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f  pgnoMove!=pgnoRo
37d90 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  ot ){.      /* p
37da0 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70  gnoRoot is the p
37db0 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
37dc0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f   used for the ro
37dd0 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20  ot-page of.     
37de0 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c   ** the new tabl
37df0 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65  e (assuming an e
37e00 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63  rror did not occ
37e10 75 72 29 2e 20 42 75 74 20 77 65 20 77 65 72 65  ur). But we were
37e20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  .      ** alloca
37e30 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66  ted pgnoMove. If
37e40 20 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20   required (i.e. 
37e50 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c  if it was not al
37e60 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  located.      **
37e70 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68   by extending th
37e80 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72  e file), the cur
37e90 72 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73  rent page at pos
37ea0 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20  ition pgnoMove. 
37eb0 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61       ** is alrea
37ec0 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20  dy journaled..  
37ed0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20      */.      u8 
37ee0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e  eType;.      Pgn
37ef0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
37f00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37f10 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20  PageMove);..    
37f20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61    /* Move the pa
37f30 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20  ge currently at 
37f40 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f  pgnoRoot to pgno
37f50 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72  Move. */.      r
37f60 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
37f70 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
37f80 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
37f90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37fa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
37fb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
37fc0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
37fd0 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
37fe0 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
37ff0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
38000 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
38010 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54  P_ROOTPAGE || eT
38020 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
38030 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
38040 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
38050 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
38060 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
38070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38080 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
38090 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
380a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
380b0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
380c0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
380d0 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20  ROOTPAGE );.    
380e0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
380f0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
38100 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   );.      rc = r
38110 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
38120 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69   pRoot, eType, i
38130 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76  PtrPage, pgnoMov
38140 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 6c  e, 0);.      rel
38150 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
38160 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  ..      /* Obtai
38170 6e 20 74 68 65 20 70 61 67 65 20 61 74 20 70 67  n the page at pg
38180 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20  noRoot */.      
38190 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
381a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
381b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
381c0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
381d0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
381e0 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
381f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
38200 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38210 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
38220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
38230 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
38240 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
38250 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
38260 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
38270 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
38280 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
38290 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
382a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
382b0 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
382c0 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
382d0 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
382e0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
382f0 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
38300 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
38310 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
38320 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
38330 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
38340 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
38350 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
38360 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
38370 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
38380 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
38390 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
383a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
383b0 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
383c0 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
383d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
383e0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
383f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
38400 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
38410 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
38420 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
38430 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
38440 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
38450 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
38460 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
38470 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
38480 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
38490 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
384a0 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
384b0 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50  pRoot, flags | P
384c0 54 46 5f